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

C Discussion :

Erreur d'adresse bizarre..!!


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut Erreur d'adresse bizarre..!!
    Bonjour,

    voila, lorsque j'execute mon programme (sous borland c++ 5.01), à un moment donné j'ai l'erreur suivante :
    Thread stopped
    C:\....\...\vbdialog.exe : Fault :
    access violation at 0x77d268af : read of address 0x29


    Et lorsque je regarde l'état de la pile d'appel (call stack), en face de l'adresse 0x77d268af est affiché : C:\WINDOWS\system32\USER32.dll
    Et cette dll (USER32.dll) est associée à plusieurs adresses, et c'est la seule présente dans la pile d'appel...

    Si qq'un a déjà vu ce genre d'erreur...de quoi cela peut venir ou à quoi ça correspond..? parce que là je ne sais plus trop quoi faire...

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    tu dois avoir un pointeur invalide dans un coin que tu passes (indirectement) à une fonction de la DLL d'où l'erreur
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Bien merci, je vais regarder,
    mais cette dll je ne l'appelle à aucun moment dans mon code, j'imagine que c'est borland qui l'utilise..

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Très certainement, c'est une des DLL de base de l'API Windows
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Ben, je ne trouve pas l'erreur, voila il me semble que cela vient de ce code là :

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    #include <windows.h>
    #include <windowsx.h>
    #include <stdio.h>
    #include "vbdialog.h"
    #pragma hdrstop
     
     
    static HINSTANCE hInst;
     
    //déclaration des fonctions de la DLL
    typedef int (WINAPI *DLL_X_LEC_ART_CLE_DTA)(WORD,WORD,LPSTR,WORD,LPSTR,LPSTR);
    DLL_X_LEC_ART_CLE_DTA X_LEC_ART_CLE_DTA;
     
     
    LONG FAR PASCAL SamplesDialog (HWND hWnd,WORD wMsg,WORD wParam,LONG lParam)
    {
        char *code_fichier,*code_index,*lgcle,*code_fich_ind,*bufferDest;
        char cle_rech[20],path[20];
        short *codes;
        int *longCle;
     
      //chargement de la dll
       HMODULE hDLL = LoadLibrary("DLL.dll");
     
       X_LEC_ART_CLE_DTA = (DLL_X_LEC_ART_CLE_DTA)GetProcAddress(hDLL,"X_LEC_ART_CLE_DTA");
     
     
      // process the message
      switch( wMsg )
      {
        // process command from one of the child controls
        case WM_COMMAND:
          switch( GET_WM_COMMAND_ID(wParam,lParam) )
          {
            // ok or cancel, so end the dialog
            case IDOK:
             	code_fichier = calloc(1,1);
    				code_index = calloc(1,1);
                lgcle = calloc(1,1);
                code_fich_ind = calloc(3,1);
                bufferDest = calloc(1,1);
     
                GetDlgItemText(hWnd,IDC_CODEFICHIER,code_fichier,2);
    	         GetDlgItemText(hWnd,IDC_CODEINDEX,code_index,2);
                GetDlgItemText(hWnd,IDC_LGCLE,lgcle,3);
                GetDlgItemText(hWnd,IDC_CLERECH,cle_rech,20);
                GetDlgItemText(hWnd,IDC_PATH,path,20);
     
                *code_fich_ind = *code_fichier;
                strcat(code_fich_ind,code_index);
                codes = &code_fich_ind[0];
                *longCle = atoi(lgcle);
     
     
             	if(X_LEC_ART_CLE_DTA(*longCle,*codes,cle_rech,5,path,bufferDest)==0)
                {
                	//SetDlgItemText(hWnd,IDC_MSG,code_fich_ind);
                	//MessageBox( NULL,"ok", NULL, MB_OK | MB_APPLMODAL );
     
                   free(code_fichier); code_fichier=NULL;
                	free(code_index); code_index=NULL;
                	free(lgcle); lgcle = NULL;
                	free(code_fich_ind); code_fich_ind=NULL;
                	free(bufferDest); bufferDest=NULL;
                	break;
                }
                else
                {
                	MessageBox( NULL,"probleme ouverture fichier" , NULL, MB_OK | MB_APPLMODAL );
                   free(code_fichier); code_fichier=NULL;
                	free(code_index); code_index=NULL;
                	free(lgcle); lgcle = NULL;
                	free(code_fich_ind); code_fich_ind=NULL;
                   free(bufferDest); bufferDest=NULL;
                   break;
                }
     
             case IDCANCEL:
    	  EndDialog(hWnd, 0 );
    	  break;
          }
          break;
     
        // initialize the dialog
        case WM_INITDIALOG:
        	return FALSE;
      }
      FreeLibrary(hDLL);
      return FALSE;
    }
     
    // Turn off warning: Parameter * is never used in function WinMain...
    #pragma argsused
     
    int PASCAL WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
    {
      // save the instance
      hInst = hInstance;
     
      // load the samples dialog box
      if( DialogBox( hInstance, "Samples", NULL, (FARPROC)SamplesDialog ) == -1 )
        MessageBox( NULL, "Can't load dialog box!\n", NULL, MB_OK | MB_APPLMODAL );
     
      // end of program
      return 0;
    }
    Volia si qq'un voit qq'chose d'anormal...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 411
    Par défaut
    DialogBox( hInstance, "Samples", NULL, (FARPROC)SamplesDialog )
    1°) Un cast sur un pointeur de fonction, c'est toujours suspect.

    2°) Tes types sont obsolètes. SURTOUT le WORD pour wParam (quand wParam est un pointeur (enfin ici ça a l'air de ne jamais être le cas, et tu n'appelles pas DefWindowProc()), c'est le plantage assuré).

    3°) Ta fonction de DLL a un nom illisible, qu'on confond avec le typedef : Les noms de fonction en majuscules, c'est pas conseillé : On utilise plutôt l'UpperCamelCase.

    4°) Un strcat(), ça peut être dangereux quand strncat() existe. (encore que, je conseillerais plutôt les fonctions de <strsafe.h>)

    5°) Tu charges et tu libères ta DLL à CHAQUE MESSAGE ?

    6°) J'ai trouvé l'erreur! GetDlgItemText() avec des tailles trop grandes pour tes buffers (ils ne font qu'un seul octet, et toi tu y mets 2 voire 3 caractères, carac nul compris),
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    En fait mon but est de refaire une dll existante (dll d'acces à une base données 16bits) mais en 32 bits, du coup je suis obliger de reprendre les meme nom de fonction pour que les applications utilisant la dll fonctionnent

    Et je ne suis pas un pro de la programmation avec l'api windows (j'ai utilisé du code provenant d'un exemple), j'ai juste créer une fenetre pour pouvoir tester ma dll, du coup je comprend pas toute tes remarques (DefWindowProc() ?? DialogBox( hInstance, "Samples", NULL, (FARPROC)SamplesDialog ) ??? je comprend pa trop ), mais je vais tenter de comprendre.

    Pour le chargement de la dll, je devrais peut etre mieux la charger dans le WinMain je suppose...? pour pas qu'elle ne soit chargée à chaque message..?

    sinon je vais examiner ta solution (6°))

    merci beaucoup

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Voila j'ai modifié mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    code_fichier = calloc(2,1);
    code_index = calloc(2,1);
    lgcle = calloc(3,1);
     
    GetDlgItemText(hWnd,IDC_CODEFICHIER,code_fichier,2);
    GetDlgItemText(hWnd,IDC_CODEINDEX,code_index,2);
    GetDlgItemText(hWnd,IDC_LGCLE,lgcle,3);
    et l'erreur intervient toujours après l'appel de la dll, sur le ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox( NULL,"ok", NULL, MB_OK | MB_APPLMODAL );
    et lorsque cette ligne de code est en commentaire, l'erreur intervient quand meme, mais un peu plus tard, de façon aléatoire j'ai l'impression

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 411
    Par défaut
    Bon, j'ai corrigé un minimum : J'ai pas pu tester, et j'ai du mettre des trucs temporaires pour que ça compile (defines manquants etc.) que tu devras enlever.
    Mais au moins, chez moi, ça compile à présent sans erreur ni warning.
    Code corrigé : 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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    //MED - J'ai rajouté ça parce que mon projet actuel est en UNICODE.
    #undef _UNICODE
    #undef UNICODE
    //MED - Pour compiler sous Visual 2005
    #define _CRT_SECURE_NO_DEPRECATE
    #include <windows.h>
    #include <windowsx.h>
    #include <stdio.h>
    
    //MED - Pour que ça compile chez moi, j'ai viré les inclusions de headers manquants
    //#include "vbdialog.h"
    
    //#pragma hdrstop
    
    //MED - Pour que ça compile chez moi, j'ai viré les inclusions de headers manquants
    #define IDC_CODEFICHIER 1000
    #define IDC_CODEINDEX 1001
    #define IDC_LGCLE 1002
    #define IDC_CLERECH 1003
    #define IDC_PATH 1004
    
    static HINSTANCE hInst;
    
    //déclaration des fonctions de la DLL
    typedef int (WINAPI *DLL_X_LEC_ART_CLE_DTA)(WORD,WORD,LPSTR,WORD,LPSTR,LPSTR);
    //DLL_X_LEC_ART_CLE_DTA x_lec_art_cle_dta;
    
    //defines pour les tailles (à modifier sans doute)
    #define TAILLE_CODE_FICHIER 2
    #define TAILLE_CODE_INDEX 2
    #define TAILLE_LGCLE 3
    #define TAILLE_CODE_FICH_IND 3
    
    //MED - déclaration obsolète
    //LONG FAR PASCAL SamplesDialog (HWND hWnd,WORD wMsg,WORD wParam,LONG lParam)
    INT_PTR CALLBACK SamplesDialog(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	//MED - Eviter les Return multiples
    	INT_PTR bRetour = TRUE;
    	//MED - Déplacé les déclarations dans un bloc
    
    	// process the message
    	switch( uMsg )
    	{
    	// process command from one of the child controls
    	case WM_COMMAND:
    		switch( GET_WM_COMMAND_ID(wParam,lParam) )
    		{
    		// ok or cancel, so end the dialog
    		case IDOK:
    			{
    			//MED - Pourquoi utiliser de l'allocation dynamique, en fait ?
    			char *code_fichier,*code_index,*lgcle,*code_fich_ind,*bufferDest;
    			char cle_rech[20],path[20];
    			short *codes;
    			//int *longCle; MED - Pointeur non-initialisé et inutile.
    			int longCle;
    			DLL_X_LEC_ART_CLE_DTA x_lec_art_cle_dta;
    
    			//chargement de la dll
    			HMODULE hDLL = LoadLibrary("DLL.dll");
    
    			x_lec_art_cle_dta = (DLL_X_LEC_ART_CLE_DTA)GetProcAddress(hDLL,"X_LEC_ART_CLE_DTA");
    
    			code_fichier = calloc(TAILLE_CODE_FICHIER,1);
    			code_index = calloc(TAILLE_CODE_INDEX,1);
    			lgcle = calloc(TAILLE_LGCLE,1);
    			code_fich_ind = calloc(TAILLE_CODE_FICH_IND,1);
    			bufferDest = calloc(1,1);
    
    			GetDlgItemText(hWnd,IDC_CODEFICHIER,code_fichier,TAILLE_CODE_FICHIER);
    			GetDlgItemText(hWnd,IDC_CODEINDEX,code_index,TAILLE_CODE_INDEX);
    			GetDlgItemText(hWnd,IDC_LGCLE,lgcle,TAILLE_LGCLE);
    			GetDlgItemText(hWnd,IDC_CLERECH,cle_rech,20);
    			GetDlgItemText(hWnd,IDC_PATH,path,20);
    
    			//*code_fich_ind = *code_fichier; MED - Il y a plus explicite
    			//strcat(code_fich_ind,code_index); MED - mauvais
    			code_fich_ind[0] = code_fichier[0];
    			strncat(code_fich_ind, code_index, TAILLE_CODE_FICH_IND-1);
    			//(les fonctions de MS ne mettent pas toujours le zéro terminal)
    			code_fich_ind[TAILLE_CODE_FICH_IND-1] = '\0';
    			
    			//MED - J'ignore à quoi sert codes, mais il faut un cast ici
    			//codes = &code_fich_ind[0];
    			codes = (short *)code_fich_ind;
    			//*longCle = atoi(lgcle);
    			longCle = strtol(lgcle, NULL, 10);
    
    
    			if(x_lec_art_cle_dta(/* * */longCle,*codes,cle_rech,5,path,bufferDest)==0)
    			{
    				//SetDlgItemText(hWnd,IDC_MSG,code_fich_ind);
    				//MessageBox( NULL,"ok", NULL, MB_OK | MB_APPLMODAL );
    
    				//MED - Déplacé les free
    				//MED - Déplacé le break
    			}
    			else
    			{
    				MessageBox( NULL,"probleme ouverture fichier" , NULL, MB_OK | MB_APPLMODAL );
    				//MED - Déplacé les free
    				//MED - Déplacé le break
    			}
    			free(code_fichier); code_fichier=NULL;
    			free(code_index); code_index=NULL;
    			free(lgcle); lgcle = NULL;
    			free(code_fich_ind); code_fich_ind=NULL;
    			free(bufferDest); bufferDest=NULL;
    			FreeLibrary(hDLL);
    			}//Bloc de variables locales
    			break;
    
    		case IDCANCEL:
    			EndDialog(hWnd, 0 );
    			break;
    		}
    		break;
    
    	// initialize the dialog
    	case WM_INITDIALOG:
    		//bRetour = FALSE; //MED - Il vaut mieux laisser TRUE si on ne règle pas soi-même le focus
    		break;
    	default:
    		bRetour = FALSE;
    	}//switch
    	return bRetour;
    }
    
    // Turn off warning: Parameter * is never used in function WinMain...
    //#pragma argsused
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
    {
    //MED - Paramètres non-utilisés:
    (void)hPrevInstance;	//toujours NULL depuis Win32
    (void)lpszCmdLine;
    (void)nCmdShow;
    
    // save the instance
    hInst = hInstance;
    
    // load the samples dialog box
    if( DialogBox( hInstance, "Samples", NULL, SamplesDialog ) == -1 )
    	MessageBox( NULL, "Can't load dialog box!\n", NULL, MB_OK | MB_APPLMODAL );
    
    // end of program
    return 0;
    }
    Si on veut que ça puisse compiler aussi bien en unicode qu'en normal, il y aurait des trucs à changer, bien sûr. Pour l'instant, ça ne compile qu'en normal ("Multi-Byte", qu'ils appellent ça)

    PS: Tu es sûr que ta DLL ne désalloue rien entretemps, hein?
    Ce ne serait pas prudent en tout cas: En règle générale, un truc alloué par une fonction d'une DLL doit être désalloué par une fonction de la même DLL.

    Edit: Un petit oubli (PASCAL est obsolète)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Merci beaucoup, je vais examiner tout ça..

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Ben voici le code de ma dll, il me semble que je desalloue bien les espaces que j'allou et il ne compile pas chez moi, il m'indique l'erreur suivante :
    Declaration syntax error sur la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INT_PTR CALLBACK SamplesDialog(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    Code de dll.c :
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    BOOL WINAPI Dllmain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
    {
    	switch (fdwReason)
    	{
    		case DLL_PROCESS_ATTACH:
    		case DLL_THREAD_ATTACH:
    		case DLL_THREAD_DETACH:
    		case DLL_PROCESS_DETACH:
    		break;
    	}
    	return 0;
    }
     
    int _stdcall X_LEC_ART_CLE_DTA(WORD lgCle,WORD cdeFicInd,LPSTR cleRech,WORD adNumEnreg,LPSTR src,LPSTR dest)
    {
    	FILE *file;
       char cdeFic[2],cdeInd[2],fichierHEA[512],nomFichierFIC[14],nomFichierIDX[14];
    	char *c1,*c2,c=0xFF,path[20];
       int i=0,j=0,*tailleEnreg,*tailleInd;
     
       cdeInd[0] = (cdeFicInd >> 8) & 0xFF;
       cdeInd[1] = 0;
       cdeFic[0] = cdeFicInd & 0xFF;
       cdeFic[1] = 0;
     
       //ouverture et lecture du fichier .HEA
       strcpy(path,src);
       strcat(src,cdeFic);
       strcat(src,".HEA");
       if ((file=fopen(src,"rb")) == NULL) return 1;
       fread(fichierHEA,1,512,file);
     
       //allocation de memoire
       c1 = calloc(1,1);
       c2 = calloc(1,1);
       dest = realloc(dest,1000);
       tailleEnreg = calloc(1,2);
       tailleInd = calloc(1,2);
     
       strcpy(dest,"salut");
     
       //récupere nom du fichier .FIC
       while(i<14)nomFichierFIC[i++] = fichierHEA[3+i];
     
       //récupère taille d'un enregistrement
       *c1 = fichierHEA[16];
       *c2 = fichierHEA[17];
       *tailleEnreg = (*c2)*256 + (*c1);
     
       //recupere nom du fichier .IDX et longueur index
       i=0;
       while(fichierHEA[48+i] != c)
       {
          if(fichierHEA[48+i]==cdeInd[0])
          {
             while(j<14)nomFichierIDX[j++] = fichierHEA[48+i+3+j];
             *c1 = fichierHEA[48+i+16];
             *c2 = fichierHEA[48+i+17];
             *tailleInd = (*c2)*256 + (*c1);
             if(*tailleInd > lgCle) *tailleInd = lgCle;
          	break;
          }
        	i = i+32;
       }
     
       if(fichierHEA[48+i]==c)
       {
       	free(c1); c1=NULL;
       	free(c2); c2=NULL;
       	free(tailleEnreg); tailleEnreg=NULL;
       	free(tailleInd); tailleInd=NULL;
          fclose(file);
          return 1;
       }
     
       //recupere emplacement
       *c1 = fichierHEA[48+i+16+2];
       *c2 = fichierHEA[48+i+16+3];
     
     
       //ouverture et lecture fichier .IDX
       strcpy(src,path);
       strcat(src,nomFichierIDX);
       if ((file=fopen(src,"rb")) == NULL)
       {
       	free(c1); c1=NULL;
       	free(c2); c2=NULL;
       	free(tailleEnreg); tailleEnreg=NULL;
       	free(tailleInd); tailleInd=NULL;
          fclose(file);
          return 1;
       }
       //lecture direct ds fichier ou dans un tableau ???
       //fread(fichierHEA,1,512,file);*
     
     
       free(c1); c1=NULL;
       free(c2); c2=NULL;
       free(tailleEnreg); tailleEnreg=NULL;
       free(tailleInd); tailleInd=NULL;
       fclose(file);
    	return 0;
    }

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    codes = (short *)code_fich_ind;
    me sert à stocker deux caractères sur 2 octets (pour que ce soit compatible avec le 2eme argument de type WORD de la fonction (x_lec_art_cle_dta) de la dll)
    et par exemple

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 411
    Par défaut
    Pour la Declaration Syntax Error, ça me donne l'impression que le typedef INT_PTR ou le define CALLBACK manquent... Tu utilises quel compilo et quel SDK ? Normalement, ces deux types sont dispo sous VC++6, avant je ne sais pas...

    En tout cas, ça compile chez moi, ça passe sans cast, et c'est bien comme ça qu'une DialogProc est déclarée:
    http://msdn.microsoft.com/library/de...dialogproc.asp


    Quant à ton codes, tout ça pour ça ?
    Tu ne peux pas utiliser tout simplement la macro MAKEWORD qui prend deux paramètres de type char en entrée ? (Et qui, elle, ne dépend pas de l'endianness)
    NOTE: Le premier paramètre est l'octet faible (comme le premier octet de code_fich_ind), le second paramètre est l'octet fort (comme le second octet de code_fich_ind)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Ben tout ce que je peux te dire c'est que j'utilise Borland c++ 5.01, qui doit dater de 1996...
    comment savoir quel est le compilateur et le sdk que j'utilise, je sais pas trop..

    Tu ne peux pas utiliser tout simplement la macro MAKEWORD qui prend deux paramètres de type char en entrée ? (Et qui, elle, ne dépend pas de l'endianness)
    comment on l'utilise, je connais pas trop les macros, elle depend d'une librairie ?

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //MED - Pourquoi utiliser de l'allocation dynamique, en fait ?
    char *code_fichier,*code_index,*lgcle,*code_fich_ind;
    Je devrais mieux declarer des chaines de caracteres et supprimer les "calloc" correspondants ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char code_fichier[2],code_index[2],lgcle[2],code_fich_ind[3];

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 411
    Par défaut
    Borland : Ben, y'a des chances...

    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define CALLBACK _stdcall
    // ou #define CALLBACK PASCAL si ça ne marche pas
    si ce n'est pas CALLBACK qui manque, alors c'est INT_PTR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef int INT_PTR;
    // à supposer que le int fait 32bits. Sinon, il faudra utiliser un long
    MAKEWORD : C'est une macro qui n'utilise aucune fonction (elle ne dépend donc d'aucune bibliothèque) et qui est définie dans windows.h ou un des fichiers qu'il inclut.
    En clair, normalement, tu tapes WORD machin = MAKEWORD(a,b) et ça marche.

    Pour les tableaux : Ben si ça marche, oui.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    C'était le INT_PTR qu'il ne connaissait pas, du coup c'est bon ça fonctionne en mettant .

    Idem pour "MAKEWORD" et pour les tableaux.
    J'y vois plus clair maintenant
    Merci pour ton aide

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

Discussions similaires

  1. Erreur de compilation bizarre
    Par Florian.L dans le forum C
    Réponses: 3
    Dernier message: 11/05/2007, 17h31
  2. Erreur sur adresse rtl60.bpl
    Par Xavier dans le forum C++Builder
    Réponses: 10
    Dernier message: 11/01/2007, 11h07
  3. Des adresses bizarres
    Par kagura dans le forum Langage
    Réponses: 7
    Dernier message: 02/11/2006, 14h38
  4. erreur ORA-01400 bizarre
    Par fpouget dans le forum Oracle
    Réponses: 4
    Dernier message: 31/08/2006, 09h48
  5. [SQL] Erreur de parse bizarre...
    Par TommyWeb dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/02/2006, 23h54

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