IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Problème avec WinAPI + sqlite


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Points : 17
    Points
    17
    Par défaut Problème avec WinAPI + sqlite
    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):
    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;
    }
    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
    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;
    }
    Dans cette partie du code:
    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);
    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.
    Ç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.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Points : 17
    Points
    17
    Par défaut Plus d'information
    Saluts,

    Après quelques testes, nous avons découvert le context dans lequel le problème se produit. Ce n'a pas relation avec le nombre d'appels au sqlite3_exec.
    C'est ça: la fonction sqlite3_exec, dans l'éxecution, appelle une fonction callback pour chaque résultat de cherche dans la base de données; quand il y a plus que 3 résultats, l'"Access Violation" se passe.
    Bien, maintenant, nous avons isolé le problème... Mais pourquoi est-ce qu'il se passe? L'étrange est, comme nous avons déjà dit, que ce ne se passe pas dans un projet Console.
    Nous avons mis à jour le fichier, maintenant avec une base de données (dict.db) avec las données suivantes:
    -------------
    columnes a - b
    key1 - value1
    key1 - value2
    key2 - value1
    key2 - value2
    key2 - value3
    key2 - value4
    key2 - value5
    key2 - value6
    -------------
    Quand on appelle sqlite3_exec(db, "select * from a where a = 'key1'", callback, 0, &zErrMsg);, l'erreur ne se passe pas, parce qu'il trouve 2 résultats; mais, quand on appelle sqlite3_exec(db, "select * from a where a = 'key2'", callback, 0, &zErrMsg);, l'erreur biensûr se passe, parce qu'il trouve plus que 3 résultats.
    Quelques idées?
    Merci d'avance.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Hello Brasil tudo bem,de onde é voce ?

    pq avoir recours à une fonction CALLBACK ?

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 30
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Hello Brasil tudo bem,de onde é voce ?

    pq avoir recours à une fonction CALLBACK ?
    Parce que nous ne savons pas le faire sans une fonction CALLBACK... En tout cas, nous avons déjà résolu le problème (sqlite exige que les appels du compilateur à la fonction sqlite3_exec ont un défaut d'appel _cdecl).
    Nós somos do Rio de Janeiro...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec Eclipse/SQLite
    Par Heisenberg56 dans le forum Android
    Réponses: 8
    Dernier message: 11/02/2014, 13h33
  2. [C#]problème avec SqLite
    Par ClaudeBg dans le forum Linq
    Réponses: 8
    Dernier message: 18/06/2009, 16h17
  3. Problème avec SQLITE
    Par Jiyuu dans le forum Django
    Réponses: 2
    Dernier message: 12/03/2009, 07h07
  4. Problème avec PHP5 et SQLite
    Par oneTime dans le forum SQLite
    Réponses: 6
    Dernier message: 05/08/2008, 11h04
  5. Réponses: 2
    Dernier message: 02/06/2006, 23h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo