0xC0000005: violation d'Accès de l'exécution de l'emplacement 0x00000000
Je suis en train d'écrire un projet MFC qui essaie d'appeler une fonction dans la DLL qui va retourner une partie de l'information dans une chaîne de caractères. La fonction dans la DLL est comme suit:
int GetInfo(char* Info)
La fonction retourne 0 en cas de succès. L'Information sera retourné dans le paramètre de la chaîne. L'appel de la routine est comme suit:
typedef int (WINAPI *FUNC1)(char* szInfo);
HINSTANCE hinstLib;
FUNC1 GetInfo;
char szInfo[50];
hinstLib = LoadLibrary(TEXT("DevInfo.dll"));
//If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
GetInfo = (FUNC1) GetProcAddress(hinstLib, "GetInfo");
//If the function address is valid, call the function.
if (NULL != GetInfo)
{
if((GetInfo) (szInfo)) //Error here!!
{
AfxMessageBox(_T("Error Reading"));
}
}
FreeLibrary(hinstLib);
}
Ce code n'a pas d'erreur dans la compilation et la liaison. Lors de l'exécution, il sera de retour l'erreur de violation d'Accès "de l'exécution de l'emplacement 0x00000000" à l'emplacement indiqué ci-dessus. Quelqu'un peut-il des conseils?
int WINAPI(char*)
etint(char*)
ne sont pas la même chose. Votre fonction shold être au moins prototypée commeint WINAPI GetInfo(char*)
- Êtes-vous sûr que l'erreur est là, et pas dans le
GetInfo
fonction? - Quel est le débogueur de montrer que la pile d'appel, etc lorsque l'exception est levée?
- Je n'ai pas le code de la DLL. Ne peut donc pas modifier la fonction. J'ai essayé de changer le typedef int (WINAPI FUNC1)(char szInfo) pour typedef int (FUNC1)(char szInfo) et toujours le même message d'erreur.
- La pile d'appel est présenté comme 00000000() [Images ci-dessous peut-être incorrect et/ou manquant] DevInfo.dll!002711eb()
- Ok, essayez de vice-versa: ne pas utiliser la WINAPI dans vos déclarations
Vous devez vous connecter pour publier un commentaire.
Vous avez essayé d'écrire (ou de déréférencement) un pointeur NULL. Comme vous avez vérifié tous les possibles valeurs Null dans votre code appelant, l'erreur la plus probable, est dans votre code.
Si vous avez vérifié votre code et ne peut pas trouver une raison pour une référence nulle exception, il n'y a, considérez que vous avez manqué de faire correspondre les conventions d'appel correctement. Le type de votre pointeur de fonction doit être EXACTEMENT le même que dans votre bibliothèque:
Pour
int GetInfo(char* Info)
la définition de type doit êtretypedef int (*FUNC1)(char* szInfo);
Il est également possible que plus de 50 caractères sont écrites dans la mémoire tampon (szInfo):
char szInfo[50];