[VC++] Classe dans une DLL : fonctions virtuelles et erreur LNK2001

Classe dans une DLL : fonctions virtuelles et erreur LNK2001 [VC++] - C++ - Programmation

Marsh Posté le 17-06-2002 à 15:03:44    

J'ai un EXE qui contient les fichiers de la classe Facade : Facade.h & Facade.cpp
 
J'ai une DLL (linkée dynamiquement) qui contient juste Facade.h
 

Code :
  1. class Facade {
  2. public:
  3.   int zeData;
  4.   int zeMethode();
  5.   virtual int virtMethode();
  6. };


 
Ma DLL reçoit un pointeur sur une instance (créée dans l'EXE) de Facade : Facade* pFacade mais j'ai un problème :
Dans la DLL, je peux accéder à pFacade->zeData et pFacade->virtMethode() mais pas à pFacade->zeMethode(), j'obtiens la classique erreur 'LNK2001' à la compilation.
 
Question : pourquoi cette LNK2001 ??? Je sais bien qu'il y a une vtable pour les virtuelles mais pourquoi la DLL ne peut pas accéder à une simple méthode ?  :??:

Reply

Marsh Posté le 17-06-2002 à 15:03:44   

Reply

Marsh Posté le 17-06-2002 à 15:10:28    

Reply

Marsh Posté le 17-06-2002 à 15:13:23    

antp a écrit a écrit :

c'est la mode de cette erreur ?
http://forum.hardware.fr/forum2.php3?post=21494&cat=10  




 
Merci pour cette utile intervention  :sarcastic:


Message édité par smaragdus le 17-06-2002 à 15:22:29
Reply

Marsh Posté le 17-06-2002 à 15:24:24    

ben c normale, pour une fonction il faut forcement l'implantation de ladite fonction . fo inclure le cpp dans la dll


Message édité par chrisbk le 17-06-2002 à 15:25:17
Reply

Marsh Posté le 17-06-2002 à 15:24:43    

bhen en allant lire cet autre post ça t'aidera peut-être à résoudre le problème :na:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-06-2002 à 15:26:29    

smaragdus> as tu inclus le .lib correspondant à ta DLL dans ton projet ?


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

Marsh Posté le 18-06-2002 à 14:32:41    

Harkonnen a écrit a écrit :

smaragdus> as tu inclus le .lib correspondant à ta DLL dans ton projet ?  




 
Non, je n'ai pas inclus le lib de la DLL dans l'EXE car j'effectue le lien de l'unique fonction exportée avec GetProcAdress. Je procède ainsi afin de pouvoir recompiler la DLL sans avoir à recompiler l'EXE.
 
Le problème vient du fait que la DLL ne peut pas appeler une méthode non-virtuelle d'un objet passé à la DLL. Si la méthode est virtuelle, le late-binding (qui utilise les vtables, non ?) permet de contourner le problème.
 
chrisbk> Non je n'ai pas inclu le cpp dans la DLL puisqu'il est déjà inclu dans l'EXE.


Message édité par smaragdus le 18-06-2002 à 15:52:03
Reply

Marsh Posté le 18-06-2002 à 14:36:10    

manque pas un dllexport / import ?

Reply

Marsh Posté le 18-06-2002 à 15:29:59    

youdontcare a écrit a écrit :

manque pas un dllexport / import ?  




 
Ben non, je n'utilise pas les '.lib'

Reply

Marsh Posté le 18-06-2002 à 17:28:27    

Bon ben, ne cherchez plus.  
Ca marche très bien avec des méthodes virtuelles donc c'est OK pour moi.

Reply

Marsh Posté le 18-06-2002 à 17:28:27   

Reply

Marsh Posté le 18-06-2002 à 17:46:47    

Smaragdus a écrit a écrit :

 
 
Ben non, je n'utilise pas les '.lib'  




Ben justement tu devrais :D
c'est de la que viens ton Pb
il faut que tu ajoutes le .lib et le declspec(dllimport/dllexport)

Reply

Marsh Posté le 18-06-2002 à 17:48:08    

BENB a écrit a écrit :

 
Ben justement tu devrais :D
c'est de la que viens ton Pb
il faut que tu ajoutes le .lib et le declspec(dllimport/dllexport)  




 
Comme je l'ai dit plus haut, je ne peux pas utiliser les .lib car je ne veux pas recompiler l'exe à chaque nouvelle version de la DLL.
 
Et puis si le problème venait de là, je ne pourrais pas accéder à la classe, non ? :??:


Message édité par smaragdus le 18-06-2002 à 17:51:49
Reply

Marsh Posté le 18-06-2002 à 17:50:32    

Pourquoi recompiler l'exe au fait ? A partir du moment ou tu changes pas le nom des fonctions de ta DLL et leurs arguments, tu n'as pas à recompiler l'exe je pense.


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

Marsh Posté le 18-06-2002 à 17:51:54    

Smaragdus a écrit a écrit :

 
 
Comme je l'ai dit plus haut, je ne peux pas utiliser les .lib car je ne veux pas recompiler l'exe à chaque nouvelle version de la DLL.  




Sauf qu'ici c'est dans l'autre sens...
 
c'est le .lib de l'exe que tu dois mettre dans la Dll
declspec(dllexport) dans l'exe.
declspec(dllimport) dans la dll...
 
evidement le plus propre serait sans doute d'avoir 2 Dlls :
le nouvelle Dll exportant facade pour l'exe et ta Dll...
Mais ne soyons pas plus royalistes que le roi. :D Si cette Dll ne doit pas etre utilisée par un autre exe, il n'y a pas de problème... Dans le cas contraire...


Message édité par BENB le 18-06-2002 à 17:55:33
Reply

Marsh Posté le 18-06-2002 à 17:58:17    

BENB a écrit a écrit :

 
Sauf qu'ici c'est dans l'autre sens...
 
c'est le .lib de l'exe que tu dois mettre dans la Dll
declspec(dllexport) dans l'exe.
declspec(dllimport) dans la dll...
 
evidement le plus propre serait sans doute d'avoir 2 Dlls :
le nouvelle Dll exportant facade pour l'exe et ta Dll...
Mais ne soyons pas plus royalistes que le roi. :D Si cette Dll ne doit pas etre utilisée par un autre exe, il n'y a pas de problème... Dans le cas contraire...  




 
 
Le lib de l'EXE ?  :heink: Je pensais que ça existait seulement pour les librairies type DLL. Je vais tester ça tout de suite.

Reply

Marsh Posté le 18-06-2002 à 18:01:23    

Smaragdus a écrit a écrit :

 
 
 
Le lib de l'EXE ?  :heink: Je pensais que ça existait seulement pour les librairies type DLL. Je vais tester ça tout de suite.  




Bien sur, le code d'implementation de ta classe se trouve dans l'exe, non ? Donc c'est à lui d'exporter le code...
le .lib apparaitra dès que tu mettras un declspec(dllexport) quelque part dedans...
 
Par contre attention ta Dll ne pourra plus etre linkée qu'avec ce prog.

Reply

Marsh Posté le 19-06-2002 à 15:47:44    

BENB a écrit a écrit :

 
Bien sur, le code d'implementation de ta classe se trouve dans l'exe, non ? Donc c'est à lui d'exporter le code...
le .lib apparaitra dès que tu mettras un declspec(dllexport) quelque part dedans...
 
Par contre attention ta Dll ne pourra plus etre linkée qu'avec ce prog.  




 
Ca marche nickel, merci BENB  :jap:  
Sinon pour le dernier point, c'est pas un problème puisque c'est un SDK.

Reply

Marsh Posté le 19-06-2002 à 15:59:45    

Smaragdus a écrit a écrit :

 
 
Ca marche nickel, merci BENB  :jap:  
Sinon pour le dernier point, c'est pas un problème puisque c'est un SDK.  




Il ne faut non plus renommer ton prog (l'exe) ! sinon il sera impossible de charger ta Dll :D

Reply

Sujets relatifs:

Leave a Replay

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