привет всем. а как в fasm можно выйти из процедуры, возвратив 0? дело в том, что пытаюсь сделать callback функцию для работы с sqlite3. если пишу просто ret, то после sqlite3_exec возвращается код 4. почитал на сайте sqlite про это и там говорится, что если функция возвращает отличное от нуля значение, то sqlite3_exec завершается и возвращает 4. спасибо.
=/ все равно почему-то падает... на 4 строке в eax почему-то оказывается текст из БД, который я выбираю и на этом функция падает =/ вот код: Код (Text): section '.code' code readable executable main: invoke sqlite3_open, dbName, hdb invoke sqlite3_exec, [hdb], sql, CallBack, 0, 0 invoke sqlite3_close, [hdb] invoke ExitProcess, 0 proc CallBack notUsed, coln, rows, colnm invoke MessageBox, sub eax, eax ret endp
ну я с отладчиком пока на вы просто глянул в олли, что падает при помещении в буфер текста из БД. =/ глянул на форуме fasm'a - вроде делаю все тоже самое.
e4key Что это такое ? Под этим именем может быть всё что угодно, я могу так загрузчик оси обозвать. Изучать правила форума, иначе топик следует закрыть.
sqlite3 - субд) sqlite3_open - функция открытия бд. вот импорт: Код (Text): section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ sqlite3, 'sqlite3.dll' import sqlite3,\ sqlite3_open, 'sqlite3_open',\ sqlite3_exec, 'sqlite3_exec',\ sqlite3_close, 'sqlite3_close' include 'api\kernel32.inc' include 'api\user32.inc' вот данные: Код (Text): hdb dd ? dbName db 'signons.sqlite', 0 sql db 'SELECT hello FROM hello_table', 0
Всё бы хорошо, НО не понятно какой тип вызова CallBack. Если она stdcall то может стоит написать ret 10h? Зачем юзать масмовские макросы? Может в них и проблема?
Clerk Ну у нормальных людей это простая СУБД на файлах такая, причем очень известная. И упоминание её названия вполне достаточно, чтобы дать понять, о чем идет речь. В любом случае, если ты встречаешь незнакомое название - just google it
Код (Text): proc CallBack c,notUsed, coln, rows, colnm ;c значит cdecl-конвенция вызова. ;ну и тут параметры в MessageBox наверное нужно? xor eax,eax ret
iZzz32, да несколько неожиданно)) а как вывести то, что получилось? ) пробую через wsprintf, результат - коразябры)
Код (Text): ;------------------------------------------------------------------------------; ; Compile with flat assembler v1.68+, <http://flatassembler.net/download.php>. ; ;------------------------------------------------------------------------------; format pe gui 4.1 entry start include 'win32a.inc' start: ccall [sqlite3_open],dbName,hdb test eax,eax jnz .error ccall [sqlite3_exec],[hdb],sql,CallBack,0,0 test eax,eax jnz .error ccall [sqlite3_close], [hdb] xor eax,eax retn .error: ccall [sqlite3_errmsg],[hdb] ccall [wsprintf],errormsg,errorfmt,eax stdcall [MessageBox],0,errormsg,title,MB_ICONERROR ccall [sqlite3_close],[hdb] xor eax,eax inc eax retn proc CallBack c,data,nCols,values,headers push ebx edi xor ebx,ebx mov edi,dumpbuff mov [edi],bl ; Очищаем буфер. .loop_dump: mov eax,[values] ; Берём указатель на массив. mov eax,[eax+ebx*4] ; Читаем элемент номер ebx (указатель уже на строку). mov edx,[headers] mov edx,[edx+ebx*4] ccall [wsprintf],edi,dumpfmt,edx,eax add edi,eax inc ebx cmp ebx,[nCols] jb .loop_dump stdcall [MessageBox],0,dumpbuff,title,MB_ICONINFORMATION xor eax,eax pop edi ebx ret endp title db 'SQLite Demo',0 errorfmt db 'SQLite error: %s',0 dumpfmt db '%s',0x09,'= %s',0x0d,0x0a,0 dbName db 'foo.sqlite',0 sql db 'SELECT date(''now''), sqlite_version(), COUNT(*) FROM sqlite_master',0 hdb dd ? errormsg rb 1024 dumpbuff rb 1024 data import library kernel32,'kernel32.dll',\ user32,'user32.dll',\ sqlite3,'sqlite3.dll' include 'api/kernel32.inc' include 'api/user32.inc' import sqlite3,\ sqlite3_open,'sqlite3_open',\ sqlite3_exec,'sqlite3_exec',\ sqlite3_errmsg,'sqlite3_errmsg',\ sqlite3_close,'sqlite3_close' end data stdcall [foo],bar,baz == invoke foo,bar,baz ccall [foo],bar,baz == cinvoke foo,bar,baz В SQLite везде cdecl и, соответственно, ccall/cinvoke. А выводить – в values/headers тебе дают указатель на массив указателей на строки (адрес массива адресов строк ). Разбирайся.