Saluts,
Windows XP Pro + Pelles C Compiler for Windows.
Nous sommes débutants de C.
(note: nous avons mis à jour le fichier .zip annexé ici; s'il vous plaît, lisez aussi le message suivant, avec plus d'information sûr l'isolement du problème)
Nous pensons que c'est une question que peut-être résolu dans le forum de Win32, mais, si vous pensez que c'est specifique de sqlite, s'il vous plaît changez ce topique...
C'est que, quand nous testons le code du sqlite3 dans notre compilateur C, dans un projet de Console, ça fonctionne bien (la fonction sqlite3_exec est externe, du header sqlite3.h. Le programme est linké avec sqlite3.lib):
MAIS, quand nous essayons de tester ce même code avec un projet Windows Application, le comportement est étrange (note: c'est un programme avec un dialogue (resource) "DIALOGO" - un dialogue simple avec un bouton IDOK).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <stdio.h> #include <sqlite3.h> sqlite3 *db; void OPENDY(void); static int callback(void *NotUsed, int argc, char **argv, char **azColName){ char autepute[2560]; sprintf(autepute, "%s", argv[1]); printf("%s\n", autepute); return 0; } int main(int argc, char *argv[]) { int ret; ret = sqlite3_open("../asasa/dict.db", &db); if (ret){ printf("ERRUS\n"); } char *zErrMsg; int rc = sqlite3_exec(db, "select * from a where a = 'asasa'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'asas'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'a'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'asa'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'sa'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'as'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'asa'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'a'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'sasa'", callback, 0, &zErrMsg); sqlite3_close(db); printf("cavasio %i\n", 1); return 0; }
Dans cette partie du code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 #include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <stdio.h> #include <string.h> #include <sqlite3.h> #include "main.h" long _stdcall zzz(); HWND b; MSG c; FILE *fp; HINSTANCE i; static int callback(void *NotUsed, int argc, char **argv, char **azColName){ char output[2560]; sprintf(output, "%s", argv[1]); MessageBox(0, output, "", 0); return 0; } _stdcall WinMain(HINSTANCE i, HINSTANCE j, char *k, int l) { b=CreateDialog(i,(LPCTSTR)"DIALOGO",NULL,(DLGPROC)zzz); ShowWindow(b,SW_SHOW); sqlite3 *db; sqlite3_open("dict.db", &db); char *zErrMsg; //MessageBox(0, "", "", 0); int rc = sqlite3_exec(db, "select * from a where a = 'asasa'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'asas'", callback, 0, &zErrMsg); //rc = sqlite3_exec(db, "select * from a where a = 'a'", callback, 0, &zErrMsg); //MessageBox(0, "", "", 0); while (GetMessage(&c,0,0,0)==TRUE) { TranslateMessage(&c); DispatchMessage(&c); } } long _stdcall zzz(HWND w, UINT x, WPARAM y, LPARAM z) { switch (x) { case WM_INITDIALOG: { // break; } case WM_COMMAND: { if (LOWORD(y) == 1){ printf("cavasio"); } break; } case WM_CLOSE: { //sqlite3 *db; //sqlite3_close(db); EndDialog(b,0); PostQuitMessage(0); break; } } //return DefWindowProc(w,x,y,z); return FALSE; }
Il seulement fonctionne jusqu'à la ligne avec "// ICI"; dans ce ligne, un erreur "Access Violation" se passe, nous pensons que c'est du fichier NTDLL.DLL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int rc = sqlite3_exec(db, "select * from a where a = 'asasa'", callback, 0, &zErrMsg); rc = sqlite3_exec(db, "select * from a where a = 'asas'", callback, 0, &zErrMsg); /*ICI*/rc = sqlite3_exec(db, "select * from a where a = 'a'", callback, 0, &zErrMsg);
Ça se passe seulement quand il trouve, dans le "dict.db", plus que 2 résultats. Avec un "dict.db" petit, l'erreur ne se passe pas.
Le détail étrange, ce que nous fait croire que le problème est général du WinAPI, est que cette erreur ne se passe pas dans un projet Console, mais se passe dans le projet Windows Application... mais, biensûr, ce que nous parlons peut être déraisonnable, parce que nous sommes débutants...
Le projet Pelles C, et les H et LIB du SQLite3 sont annexés (mais sans le dict.db grand).
Quelques idées? Merci d'avance.
Partager