chargement dynamique de dll échoue

chargement dynamique de dll échoue - C++ - Programmation

Marsh Posté le 02-06-2002 à 12:08:58    

Voila je comprends plus rien là :
j'ai créé une dll toute simple, juste pour un test. Si j'essaie de la linker en utilisant le header et la lib, ça marche nickel je peux utiliser les fonctions qui sont dessus.
Mais si j'essaie la méthode dynamique décrite dans la msdn, ie LoadLibrary suivi de GetProcAddress, ça échoue à chaque fois, et ce avec la même dll !!
Alors moi je n'avais jusqu'à présent utilisé que la 1ere méthode, donc je ne connais rien à la seconde, si vous pouviez m'expliquer ce que j'ai mal fait, vous me rendriez un immense service !!

Reply

Marsh Posté le 02-06-2002 à 12:08:58   

Reply

Marsh Posté le 02-06-2002 à 12:13:14    

qu'est-ce qui plante, LoadLibrary() ou GetProcAdress() ?

Reply

Marsh Posté le 02-06-2002 à 12:22:56    

Non, loadlibrary est nickel, c'est juste getprocaddress qui merde

Reply

Marsh Posté le 02-06-2002 à 12:27:24    

comment exportes-tu tes méthodes ? fichier .def ?
 
au passage, ce topic me rappelle que tu n'es pas le premier à poser la question ... as-tu fait une recherche ?

Reply

Marsh Posté le 02-06-2002 à 12:43:42    

verifie le typage et nom de la fonction pour getProcAdresse
 
vérifie aussi que tu as bien mis dans to projet de la dll devant les fonctions exporté:
 extern "C" __declspec(dllexport)


---------------
Ils veulent la jouer hard, on va la jouer hard  
Reply

Marsh Posté le 02-06-2002 à 13:02:04    

alors non je n'utilise pas de .def, juste des __declspec(dllexport) devant les fonctions.
Oui j'ai fais une recherche sur tous les sujets contenant dll depuis le début, et j'ai tout lu sans résultat.
hercule > j'ai essayé de rajouter extern "C", sans résultat :(
 
Voila ma déclaration :
extern "C" __declspec (dllexport) void WINAPI Coucou (void);
 
ensuite je fais ça :
typedef void (WINAPI * Fonction)(void);
Fonction Hello;
HINSTANCE hDLL = LoadLibrary ("MaDll" );
Hello = (Fonction) GetProcAddress (hDLL, "Coucou" );
et là hello = 0, et getlasterror renvoie 126 ... erreur très mal documentée.

 

[jfdsdjhfuetppo]--Message édité par freewol le 02-06-2002 à 13:03:31--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 02-06-2002 à 13:08:56    

essaye de passer par un .def, j'avais eu des problèmes avec le dllexport. le .def réglait la chose.  
 
mais tu devrais pouvoir régler le problème en lisant la doc à fond. une page de la msdn qui explique l'export en détail : http://msdn.microsoft.com/library/ [...] _a_DLL.asp

Reply

Marsh Posté le 02-06-2002 à 13:31:04    

pour le lien vers la msdn, je l'avais déjà lu, ça n'a rien réglé
ensuite pour le .def, je veux bien, mais je n'ai absolument pas compris comment ça marche, alors j'ai bien essayé de créer un fichier .ref et de l'ajouter au  projet, avec les lignes
LIBRARY MaDLL
EXPORTS
    Coucou @1
mais bon je vois pas trop ce que ça pourrait changer si je règle pas une qcq option, mais la msdn est absolument incrompréhensible à ce sujet, donc un peu d'aide serait la bienvenue ...

Reply

Marsh Posté le 02-06-2002 à 14:33:43    

un peu de lumière sur l'export :
 
http://groups.google.com/groups?q= [...] net&rnum=2 (et le thread associé)
 
en utilisant dependency walker (inclus avec vc++, sinon -> google) tu devrais retrouver le nom décoré.  
 
pour le .def, ça se rajoute dans les options de linking (alt+f7, regarde le contrôle tout en bas avec la ligne de commande). rajoute  
  /def:"monfichierdedef.def"

Reply

Marsh Posté le 02-06-2002 à 15:00:42    

ohlala ... merci merci merci !
grâce à ces 3 super conseils, je viens de tout (euh ... enfin presque tout ;)) comprendre aux dll !!
Encore merci.

Reply

Marsh Posté le 02-06-2002 à 15:00:42   

Reply

Marsh Posté le 02-06-2002 à 15:06:37    

ça marche au moins ? :D

Reply

Marsh Posté le 02-06-2002 à 15:20:19    

oui perfectly, c'est tout nickel
en fait le truc c'est que vc++ exportait ma fonction coucou sous un nom du genre ?coucouc@@XYYXYZ alors bon, c'est sur que ça marchait moins bien ...

Reply

Marsh Posté le 02-06-2002 à 15:25:10    

ok :)

Reply

Sujets relatifs:

Leave a Replay

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