2012-08-13 3 views
1

Étant donné que je dois écrire une petite bibliothèque dans Assembler qui accède à une base de données Sqlite3, j'ai lancé une recherche sur l'utilisation de sqlite3.dll. J'ai trouvé un moyen de le faire dans fasm (je dois utiliser masm32 pour de nombreuses raisons qui ne contribuent pas à résoudre le problème, c'est simplement une nécessité) via cinvoke et en référençant la bibliothèque qui n'est pas disponible comme il semble.
Ce que je voudrais essentiellement savoir, c'est s'il est possible pour moi de faire une chose similaire en masm ou si je dois obtenir les adresses de toutes les fonctions que j'ai besoin d'appeler individuellement via GetProcAddress.Comment utiliser sqlite3 avec masm32 sous Windows

Répondre

0

Pourquoi pas? Il est simple, aussi simple que:

.486 
.model flat, stdcall 
option casemap:none 

include \masm32\include\masm32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 
include sqlite3.inc 

.data 
szSQLDB   db "MyDB.db3", 0 
szRandQuery  db "SELECT * FROM Quit ORDER BY RANDOM() LIMIT 1;", 0 

.data? 
hDBase   dd ? 

.code 
START: 
    invoke sqlite3_open, offset szSQLDB, offset hDBase 

    call GetQuitMsg 

    invoke sqlite3_close, hDBase 

    invoke ExitProcess, 0 

GetQuitMsg proc 
local ppStmt 

    invoke sqlite3_prepare_v2, hDBase, offset szRandQuery, -1, addr ppStmt, 0 
    invoke sqlite3_step, ppStmt 
    invoke sqlite3_data_count, ppStmt 
    .if eax !=0 
     invoke sqlite3_column_text, ppStmt, 0 
     invoke MessageBoxA, 0, eax, 0,0   
    .endif   
    ret 
GetQuitMsg endp 
end START 

J'utilise un makefile, et Geany comme éditeur. Le zip comprend le db de test, sqlite3.inc, mais pas le sqlite3.dll juste décompresser les fichiers, plop le sqlite3.dll dans le répertoire du projet et vous serez prêt à partir. Je n'utilise pas non plus le lien MS, à la place j'utilise GoLink car il n'a pas besoin de bibliothèques d'importation, mais si vous devez utiliser MS Link, j'ai une bibliothèque d'importation SQLite quelque part.

http://www.gunnerinc.com/files/SQLiteTest.zip

0

Salam,

Il est mon code exemple :)

.386 
.model flat, stdcall 
option casemap:none 

include windows.inc 
include advapi32.inc 
include comctl32.inc 
include kernel32.inc 
include shell32.inc 
include user32.inc 

includelib advapi32.lib 
includelib comctl32.lib 
includelib kernel32.lib 
includelib shell32.lib 
includelib user32.lib 

.const 
    SQLITE_ROW equ 100 
.data? 
    dwResult dd ? 
    hDB dd ? 
    sqlite3_close dd ? 
    sqlite3_column_text dd ? 
    sqlite3_exec dd ? 
    sqlite3_open dd ? 
    sqlite3_prepare dd ? 
    sqlite3_step dd ? 
.data 
    szSQLite3Lib db "sqlite3.dll", 0h 
    szfnSQLite3_close db "sqlite3_close", 0h 
    szfnSQLite3_column_text db "sqlite3_column_text", 0h 
    szfnSQLite3_exec db "sqlite3_exec", 0h 
    szfnSQLite3_open db "sqlite3_open", 0h 
    szfnSQLite3_prepare db "sqlite3_prepare", 0h 
    szfnSQLite3_step db "sqlite3_step", 0h 
    szDBFile db "file.db", 0h 
    szSQLStmt1 db "create table DBI (nID integer primary key, szName text)", 0h 
    szSQLStmt2 db "insert into DBI (nID, szName) values (1, 'RizonBarns')", 0h 
    szSQLStmt3 db "insert into DBI (szName) values ('Rizon & Barns')", 0h 
    szSQLStmt4 db "insert into DBI (szName) values ('MASM32')", 0h 
    szSQLStmt5 db "select * from DBI", 0h 
.code 
main: 
    push offset szSQLite3Lib 
    call LoadLibraryA 
    cmp eax, 0h 
    je @ERROR 
    push offset szfnSQLite3_close 
    push eax 
    call GetProcAddress 
    mov sqlite3_close, eax 

    push offset szSQLite3Lib 
    call LoadLibraryA 
    push offset szfnSQLite3_column_text 
    push eax 
    call GetProcAddress 
    mov sqlite3_column_text, eax 

    push offset szSQLite3Lib 
    call LoadLibraryA 
    push offset szfnSQLite3_exec 
    push eax 
    call GetProcAddress 
    mov sqlite3_exec, eax 

    push offset szSQLite3Lib 
    call LoadLibraryA 
    push offset szfnSQLite3_open 
    push eax 
    call GetProcAddress 
    mov sqlite3_open, eax 

    push offset szSQLite3Lib 
    call LoadLibraryA 
    push offset szfnSQLite3_prepare 
    push eax 
    call GetProcAddress 
    mov sqlite3_prepare, eax 

    push offset szSQLite3Lib 
    call LoadLibraryA 
    push offset szfnSQLite3_step 
    push eax 
    call GetProcAddress 
    mov sqlite3_step, eax 

    push 255 
    push GPTR 
    call GlobalAlloc 
    mov hDB, eax 

    lea edx, hDB 
    push edx 
    push offset szDBFile 
    call sqlite3_open 

    push 0h 
    push 0h 
    push 0h 
    push offset szSQLStmt1 
    push hDB 
    call sqlite3_exec 

    push 0h 
    push 0h 
    push 0h 
    push offset szSQLStmt2 
    push hDB 
    call sqlite3_exec 

    push 0h 
    push 0h 
    push 0h 
    push offset szSQLStmt3 
    push hDB 
    call sqlite3_exec 

    push 0h 
    push 0h 
    push 0h 
    push offset szSQLStmt4 
    push hDB 
    call sqlite3_exec 

    push 0h 
    lea eax, dwResult 
    push eax 
    push offset szSQLStmt5 
    call lstrlenA 
    push eax 
    push offset szSQLStmt5 
    push hDB 
    call sqlite3_prepare 

@@: 
    push dwResult 
    call sqlite3_step 
    cmp eax, SQLITE_ROW 
    jne @F 
    push 0h 
    push dwResult 
    call sqlite3_column_text 
    mov esi, eax 
    push 1h 
    push dwResult 
    call sqlite3_column_text 
    mov edi, eax 
    push 0h 
    push esi 
    push edi 
    push 0h 
    call MessageBoxA 
    jmp @B 
@@: 
    push hDB 
    call sqlite3_close 
@ERROR: 
    xor eax, eax 
    push eax 
    call ExitProcess 
end main 

Il va créer le fichier de base de données avec le nom 'file.db', créez table nommée 'DBI' et insert données autant de trois lignes. Après avoir inséré des données trois fois, il affichera les données avec MessageBoxA. nID en tant que légende et szName en tant que texte.

Amusez-vous avec mon code :),

S'il vous plaît ajouter INCLUDE, LIB et environnement BIN au chemin d'installation MASM.

Exemple:

Include = C: \ MASM32 \ include

LIB = C: \ MASM32 \ lib

BIN = C: \ MASM32 \ bin

Et assurez-vous qu'il sont les chemins ci-dessus lorsque vous tapez définir à l'invite de commande.

Wassalam.