Prob avec GetProcAddress

Prob avec GetProcAddress - C - Programmation

Marsh Posté le 29-09-2004 à 20:51:01    

Salut a tous,
J'ai commencé il n'y a pas longtemps a programmer en graphique sous windows et j'ai un probleme :
J'ai fait une DLL et un prog qui doit charger cette dll, je la charge avec LoadLibrary(NomDuDll) mais je n'arrive pas a utiliser une fonction, GetProcAddress me retourne toujours un pointeur NULL.
 
Quelqu'un pourrait-il m'aider ?
merci d'avance

Reply

Marsh Posté le 29-09-2004 à 20:51:01   

Reply

Marsh Posté le 29-09-2004 à 21:03:39    

poste ton code, ce sera plus parlant

Reply

Marsh Posté le 29-09-2004 à 21:07:06    

Voici le code :
 

Code :
  1. typedef bool (*FUNC) (void);
  2. FUNC StartHook;
  3. int WINAPI WinMain (HINSTANCE hThisInstance,
  4.                     HINSTANCE hPrevInstance,
  5.                     LPSTR lpszArgument,
  6.                     int nFunsterStil)
  7. {
  8.     hDLL = LoadLibrary(DLLName);
  9.     StartHook = (FUNC) GetProcAddress(hDLL, "SetkbdHook" );
  10.     // Création d'une fenetre ...
  11.     ...
  12. }


Message édité par blastrock le 29-09-2004 à 21:07:39
Reply

Marsh Posté le 29-09-2004 à 21:08:21    

tu peux me donner le contenu exact de la variable DLLName stp ?

Reply

Marsh Posté le 29-09-2004 à 21:08:47    

voila : char DLLName[ ] = "Hook.dll";

Reply

Marsh Posté le 29-09-2004 à 21:11:21    

bingo !  
LoadLibrary prend en argument le nom de la dll, mais sans l'extension ".dll"
=> LoadLibrary("Hook" ) et pas LoadLibrary("Hook.dll" );
 
autre chose : prend l'habitude de tester les valeurs de retour des fonctions LoadLibrary et GetProcAddress, il y a plein de raisons qui pourraient les faire foirer, et si tu testes pas pourquoi, le débuggage en sera d'autant plus ardu

Reply

Marsh Posté le 29-09-2004 à 21:13:39    

ca marche tj pas, et de toute facon loadlibrary retournait un pointeur non NULL...

Reply

Marsh Posté le 29-09-2004 à 21:16:45    

appelle un GetLastError() juste après GetProcAddress pour obtenir le code d'erreur exact

Reply

Marsh Posté le 29-09-2004 à 21:18:12    

ca donne 127...

Reply

Marsh Posté le 29-09-2004 à 21:26:00    

http://msdn.microsoft.com/library/ [...] 0-499_.asp
 
127 = ERROR_PROC_NOT_FOUND, procédure non trouvée
comme je ne doute pas un seul instant que ta dll possède bien une fonction SetkbdHook(), j'en arrive à la conclusion que tu dois être emmerdé à cause de la décoration des fonctions du C++
en gros, ta fonction exportée a été décorée par le linker.
pour remédier à ceci, tu dois donc compiler ta dll et la linker façon C, ie en désactivant la décoration des fonctions (et donc en déclarant ta dll dans un bloc extern "C", et en spécifiant une convention d'appel __stdcall)


Message édité par Harkonnen le 29-09-2004 à 21:26:34
Reply

Marsh Posté le 29-09-2004 à 21:26:00   

Reply

Marsh Posté le 29-09-2004 à 21:28:31    

tu pourais me donner un petit exemple stp, j'ai jamais utilisé extern "C"

Reply

Marsh Posté le 29-09-2004 à 21:40:33    

Harkonnen a écrit :

bingo !  
LoadLibrary prend en argument le nom de la dll, mais sans l'extension ".dll"


:heink:
 
Telecharge dependency walker et regarde ce qu'exporte ta dll...
http://www.dependencywalker.com/


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 29-09-2004 à 21:46:59    

Ca marche comment ???  :??:  
quand j'ouvre ma dll, il y a :
 
HOOK.DLL
    KERNEL32.DLL
    MSVCRT.DLL
    USER32.DLL
 
et ya aucune de mes fonctions...

Reply

Marsh Posté le 29-09-2004 à 21:55:13    

blastrock a écrit :

tu pourais me donner un petit exemple stp, j'ai jamais utilisé extern "C"


Code :
  1. extern "C" {
  2. __declspec(dllexport) void SetkbdHook(void)
  3. {
  4.             // le corps de ta fonction exportée
  5. }
  6. }

Reply

Marsh Posté le 29-09-2004 à 21:55:44    

ha ! j'ai compris faut mettre _declspec(dllexport) devant les fonctions...
maintenant j'ai une fonction qui s'appelle _Z10SetkbdHookv dans dependency, c'est normal ?

Reply

Marsh Posté le 29-09-2004 à 21:57:41    

le code que tu m'a donné c'est a mettre dans le prog ou dans la dll ?

Reply

Marsh Posté le 29-09-2004 à 21:58:14    


c'était le cas dans une vieille version du Platform SDK, possible que ça ait changé depuis [:sinclaire]
 

HelloWorld a écrit :


Telecharge dependency walker et regarde ce qu'exporte ta dll...
http://www.dependencywalker.com/

problème de décoration de nom moi je dis :o

Reply

Marsh Posté le 29-09-2004 à 21:59:06    

blastrock a écrit :

ha ! j'ai compris faut mettre _declspec(dllexport) devant les fonctions...
maintenant j'ai une fonction qui s'appelle _Z10SetkbdHookv dans dependency, c'est normal ?


et faut mettre la déclaration dans extern "C" aussi :o

Reply

Marsh Posté le 29-09-2004 à 22:00:25    

c'est bon !!! ca a l'air de marcher !!
MERCI !! :)

Reply

Marsh Posté le 01-10-2004 à 10:27:52    

Harkonnen a écrit :

bingo !  
LoadLibrary prend en argument le nom de la dll, mais sans l'extension ".dll"
=> LoadLibrary("Hook" ) et pas LoadLibrary("Hook.dll" );


 
http://msdn.microsoft.com/library/ [...] ibrary.asp
 
If no file name extension is specified in the lpFileName parameter, the default library extension .dll is appended. However, the file name string can include a trailing point character (.) to indicate that the module name has no extension.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 01-10-2004 à 13:00:44    

BlackGoddess a écrit :

http://msdn.microsoft.com/library/ [...] ibrary.asp
 
If no file name extension is specified in the lpFileName parameter, the default library extension .dll is appended. However, the file name string can include a trailing point character (.) to indicate that the module name has no extension.

je savais bien qu'il y avait une subtilité avec les extensions :D


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed