Problème d'importation de classe d'une DLL

Problème d'importation de classe d'une DLL - C++ - Programmation

Marsh Posté le 10-02-2003 à 16:26:49    

Salut !
 
Je reprend (pour mon stage) le code d'une DLL que quelqu'un d'autre a écrit, et j'ai besoin de créer une fonction dans une DLL existante, et de l'utiliser dans une autre DLL (qui elle même est utilisée par un programme).
Spa très clair, mais c'est pas grave.
 
Donc dans le .h de la DLL dans lequelle je veux que soit ma fonction, je met :
 

Code :
  1. extern "C"
  2. {
  3. _declspec(dllexport) void maFonction();
  4. ... // Les autres fonctions
  5. }


 
Dans le .cpp :
 

Code :
  1. extern "C"
  2. {
  3. _declspec(dllexport) void maFonction()
  4. {
  5. // Un corps vide pour l'instant
  6. }
  7. ... // Les autres fonctions
  8. }


 
Dans le .h de la DLL où je souhaite utiliser cette fonction :
 

Code :
  1. extern "C"
  2. {
  3. typedef void (*maFonction)();
  4. ... // Les autres fonctions
  5. }


 
Puis en protected :
 

Code :
  1. fnmafonction m_mafonction;
  2. proc& GetProc(int i);
  3. struct DescProc {int offset; const char* name;};
  4. static const DescProc DllFunctions[];


 
Et dans le .cpp :
 

Code :
  1. const RecalageNexyad::DescProc RecalageNexyad::DllFunctions[] =
  2. {
  3. {OFFSET(MaClasse,m_mafonction),"maFonction"},
  4. ...// Les autres fonctions
  5. };
  6. proc& RecalageNexyad::GetProc(int i)
  7. {
  8. assert(i>=0 && i<ARRAY_SIZE(DllFunctions));
  9. return *((proc*)(((char*)this)+DllFunctions[i].offset));
  10. }


 
Dans le constructeur de ma classe :
 

Code :
  1. //charger la lib
  2. hModule = (int)LoadLibrary("nom_de_ma_dll" );
  3. if (hModule==0)
  4. {
  5. cout << "Impossible de charger la DLL: " << endl;
  6. return;
  7. }
  8. //charger les fonctions
  9. for (i=0 ; i<ARRAY_SIZE(DllFunctions) ; i++)
  10. {
  11. GetProc(i) = GetProcAddress((HMODULE)hModule, DllFunctions[i].name);
  12. if (GetProc(i)==0)
  13. {
  14. cout << "Impossible de trouver la fonction " << endl;
  15. return;
  16. }
  17. }


 
Je ne peux pas malheureusement pas faire de debug (le programme qui appelle cette DLL plante si on veut se mettre en debug), mais avec un fichier texte, je sais que ma dll se charge bien, mais pas ma fonction.
 
Qu'est ce qui ne convient pas dans ce code ? Ca va faire 2j que je suis sur ce pb là, j'en peux plus !!
 
Merci d'avance ! :bounce:


Message édité par raph77 le 11-02-2003 à 12:49:38
Reply

Marsh Posté le 10-02-2003 à 16:26:49   

Reply

Marsh Posté le 10-02-2003 à 18:53:03    

Je suppose que tu n'as pas le .lib de ta dll pour te fatiguer ainsi à lier dynamiquement ta dll.
Car si tu l'as, il suffit de faire un include "ta_dll.h" et filer le "ta_dll.lib" au linker (#pragma comment(lib, "ta_dll.lib" )) pour que ce soit fini ...
Bref, si tu persiste, sache qu'il y a deja des templates ecrites specialement pour cela et ca devrait te simplifier la vie.
ex :
http://www.codeguru.com/dll/DllStub.html
y'en a d'autres (j'ai pas les liens ici desole)
Apres pour ton pblm, faut d'abord trouver ce qui va pas ...
- fonction mal exportee ?
- fonction mal importee ?
- fonction boguee ?
- ...
 
cree un simple prog de test de ta dll a partir du .lib (aucun soucis d'import donc) qui appelle ta fonction. SI ca marche, ta dll est ok (export + no bug)
donc ca merde a l'import => utilise le .lib ou inspire toi des templates cites ci-desus.
 
Mais au vu de cette phrase :

Citation :

le programme qui appelle cette DLL plante si on veut se mettre en debug


je suis pas sur que le probleme soit la ou tu le cherches ...


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

Marsh Posté le 11-02-2003 à 00:31:58    

Merci pour ta réponse :hello: , j'ai trouvé mon problème, je compilais en debug alors que j'utilisais la release :pt1cable:
Heureusement que j'avais corrigé d'autres choses (et que du coup ça n'aurait pas marché quand même), parce que passer autant de temps pour un pb aussi idiot, je me serais flingué :pfff:

Reply

Marsh Posté le 11-02-2003 à 12:51:48    

[:yoyoz]  
 
Aujourd'hui, c'est une classe que j'aimerais importer, mais apparemment ça marche pas pareil qu'une fonction.
Sur les MSDN ils ne précisent rien de particulier je crois :(  
 
Sachant que pour la continuité du programme (et surtout parce que je connais pas encore le nom de la DLL) ce serait bien que je lie ça dynamiquement aussi.

Reply

Sujets relatifs:

Leave a Replay

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