Impossible d'obtenir l'adresse d'une function contenus dans une DLL

Résolu
cs_Nementon Messages postés 21 Date d'inscription dimanche 27 janvier 2008 Statut Membre Dernière intervention 25 mai 2010 - 24 mai 2010 à 13:02
cs_Nementon Messages postés 21 Date d'inscription dimanche 27 janvier 2008 Statut Membre Dernière intervention 25 mai 2010 - 25 mai 2010 à 13:39
Bonjours,

Voila le code simple d'une DLL et de son exécutable, compilé sous Visual 2008 et qui pour de sombres raisons plante lamentablement, lorsque l'exécutable tente de récupérer l'adresse de la function AaAaA de la DLL :

Code DLL :
#include <stdio.h>
#include <windows.h>

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpvReserved)
{
switch(dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL, L"Youuupi", L"Noname", MB_OK);
break;
case DLL_PROCESS_DETACH:
MessageBox(NULL, L"Ahahahah .... tchuus !", L"Noname", MB_OK);
break;
       }
return true;
}
__declspec(dllexport) int AaAaA(void)
{
return MessageBox(NULL, L"Héhé, ca fonctionne !", L"Noname", MB_OK);
}


Code de l'exécutable :

#include <stdio.h>
#include <windows.h>

typedef int (*Ftest)(void);
int main()
{
HMODULE hDLL = LoadLibrary(L"hookDll.dll");
if (hDLL == NULL) {
fprintf(stderr, "La dll n'as pas put etre trouvé.\n");
}	
else
{
Ftest pFTestDll = (Ftest)GetProcAddress(hDLL, "AaAaA"); 
if (pFTestDll == NULL) { // La ca plante ô.o
printf("Et bin .... ca plante la, et je suis bien dégouté :D");
}
else {
pFTestDll();
}
}
FreeLibrary(hDLL);
return 42;
}


Toute idées de génies, ou idées toutes courtes même sont les bien venus, je suis plus que dérouté devant le comportement du programme, étant donnée sa simplicité, et le faite que j'ai suivis plusieur tutoriel quasiment à la lettre.

A noté que le code suivant me retourne la même erreur :

#include <stdio.h>
#include <windows.h>

typedef int Ftest(void);
int main()
{
HMODULE hDLL = LoadLibrary(L"hookDll.dll");
if (hDLL == NULL) {
fprintf(stderr, "La dll n'as pas put etre trouvé.\n");
}	
else
{
Ftest * pFTestDll = (Ftest *)GetProcAddress(hDLL, "AaAaA"); 
if (pFTestDll == NULL) { // La ca plante ô.o
printf("Et bin .... ca plante la, et je suis bien dégouté :D");
}
else {
pFTestDll();
}
}
FreeLibrary(hDLL);
return 42;
}


Erreur qui obtenue à l'aide de LastGetError(), a une drôle de tête, "7F".

Cordialement.

2 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
24 mai 2010 à 22:43
Salut,
Ton problème vient du fait que le nom de la fonction exportée est décoré. En C++, pour éviter que les noms de fonctions soient décorées on utilise extern "C" devant __declspec(dllexport) comme ceci:
extern "C" __declspec(dllexport) int AaAaA(void)
{
return MessageBox(NULL, L"Héhé, ca fonctionne !", L"Noname", MB_OK);
}

On peut aussi utiliser un fichier .def.
Ca devrait marcher maintenant.
3
cs_Nementon Messages postés 21 Date d'inscription dimanche 27 janvier 2008 Statut Membre Dernière intervention 25 mai 2010
25 mai 2010 à 13:39
En effet, merci
0
Rejoignez-nous