[DLL] probleme export d'une classe en DLL

probleme export d'une classe en DLL [DLL] - C++ - Programmation

Marsh Posté le 23-08-2004 à 09:47:38    

Est il possible que lorsque l'on exporte une classe avec __declspec(dllexport)les méthodes de notre classe qui sont bien exportées le soit sans être décorée?
Merci
 
Je donne vite fais un source pour montrer le type de probleme.
 

Code :
  1. class __declspec(dllexport) MaClasse
  2. {
  3. private:
  4.   int a
  5. public:
  6.   Maclasse();
  7.   int getA();
  8.   MaClasse* setA(int);
  9. };


 
Voila dans ce cas les méthodes s'exportent bien mais elles sont décorées.Je voudraient qu'elles ne soient pas décorées pour faire de la liaison dynamique dessus derrière.
 
Merci de votre aide.
 
++

Reply

Marsh Posté le 23-08-2004 à 09:47:38   

Reply

Marsh Posté le 23-08-2004 à 10:02:32    

si tu veux utiliser ta DLL pour un soft créé avec le même compilateur que celui que tu as utilisé pour créer ta DLL, ça ne devrait pas poser de problème.
par contre, si le compilo est différent, alors ça ne sera pas possible. tu ne pourras exporter que des fonctions, dont la définition devra comporter un extern "C" pour désactiver la décoration des fonctions


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

Marsh Posté le 23-08-2004 à 10:11:28    

Harkonnen a écrit :

si tu veux utiliser ta DLL pour un soft créé avec le même compilateur que celui que tu as utilisé pour créer ta DLL, ça ne devrait pas poser de problème.
par contre, si le compilo est différent, alors ça ne sera pas possible. tu ne pourras exporter que des fonctions, dont la définition devra comporter un extern "C" pour désactiver la décoration des fonctions


 
SAlut,
Meme avec le même compilateur cela ne fonctionne pas. PAr contre c'est clair que pour le moment je crée des fonctions qui me servent pour la liaison avec extern "C" et donc je n'exporte plus ma classe.
Mais ca me parait bizarre (lors de l'exportation de la classe cette fois ci) de pas pouvoir rajouter un truc devant les méthodes de la classe dans le .h pour qu'elle ne soient pas décorées quand tu exporte la classe.

Reply

Marsh Posté le 23-08-2004 à 10:38:09    

Ca ne me surprend pas que ça ne fonctionne pas même avec le même compilo. Imagine que tu veuilles exporter une méthode MaClasse::MaMethode, pour la lier dynamiquement.
Tu vas donc d'abord récupérer son adresse via  

Code :
  1. Addr = GetProcAddress(hInst, "MaMethode" );


Et ensuite, tu comptes l'utiliser comment ? MaMethode est une méthode non statique, elle doit donc être appelée à partir d'un objet de classe MaClasse. Tu dois donc créer une instance de MaClasse avant d'appeler MaMethode(). Comment comptes tu t'y prendre pour faire ceci ? C'est impossible.
 
Ce que tu peux faire, c'est utiliser un peu le principe de COM :
- tu définis une interface (classe abstraite avec fonctions virtuelles pures et pas de données),
- à partir de ta DLL, tu exportes une fonction C qui, lorsqu'elle sera appelée, crééra une instance d'une classe dérivée de cette interface, et qui te renverra un pointeur vers l'interface, à partir duquel tu pourras appeler les fonctions de cette interface.


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

Marsh Posté le 23-08-2004 à 10:58:08    

Harkonnen a écrit :

Ca ne me surprend pas que ça ne fonctionne pas même avec le même compilo.


 
Je suis d'accord avec toi.


Message édité par TouperTinois le 23-08-2004 à 10:58:50
Reply

Marsh Posté le 23-08-2004 à 10:58:24    

Harkonnen a écrit :

Ca ne me surprend pas que ça ne fonctionne pas même avec le même compilo.


 
Je suis d'accord avec toi j'ai essayé aussi mais dans ce cas la, tu crée une instance de la classe avec une fonction à part exportée avec extern "C" mais apres tu ne peut toujours pas utiliser getprocadress sur "maméthode" car dasn l'exportation son nom est décoré.


Message édité par TouperTinois le 23-08-2004 à 10:59:03
Reply

Marsh Posté le 23-08-2004 à 11:05:15    

ben si maméthode est une fonction membre, alors inutile de t'exciter avec getProcAdress, ca marchera jamais

Reply

Marsh Posté le 23-08-2004 à 11:07:13    

je pense qu'Harko pensait a un truc comme ca :
 
partie commune :

Code :
  1. struct interface
  2. {
  3.    virtual void membre() = 0;
  4.    virtual void release() = 0;
  5. };


 
dans la dll :

Code :
  1. struct implementation : interface
  2. {
  3.    void membre()
  4.    {
  5.       // ...
  6.    }
  7.    void release() { delete this; }
  8. };
  9. extern "C"
  10. {
  11. interface * __declspec(dllexport) __stdcall create()
  12. {
  13.    return new implementation;
  14. }
  15. }


 
dans l'exe

Code :
  1. typedef interface *(__stdcall *pcreate)();
  2. int main()
  3. {
  4.    HMODULE hdll = LoadLibrary("tadll" );
  5.    pcreate func = GetProcAddress(hdll, "create" );
  6.    interface * obj = func();
  7.    obj->membre();
  8.    obj->release();
  9.  
  10.    FreeLibrary(hdll);
  11. }


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

Marsh Posté le 23-08-2004 à 11:09:13    

chrisbk a écrit :

ben si maméthode est une fonction membre, alors inutile de t'exciter avec getProcAdress, ca marchera jamais


 
En utilisant le nom décoré de la méthode membre de la classe ca fonctionne !!

Reply

Marsh Posté le 23-08-2004 à 11:12:59    

TouperTinois a écrit :

En utilisant le nom décoré de la méthode membre de la classe ca fonctionne !!


 
evidemment, mais bon, c'est pas fait pour. utilise ot'chose.

Reply

Marsh Posté le 23-08-2004 à 11:12:59   

Reply

Marsh Posté le 23-08-2004 à 11:22:04    

BlackGoddess a écrit :

je pense qu'Harko pensait a un truc comme ca : [...]


c'est exactement ce à quoi je pensais :jap:


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

Marsh Posté le 23-08-2004 à 11:32:30    

TouperTinois a écrit :

En utilisant le nom décoré de la méthode membre de la classe ca fonctionne !!


mais c'est particulièrement crade :heink:


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

Marsh Posté le 23-08-2004 à 12:28:21    

BlackGoddess a écrit :

je pense qu'Harko pensait a un truc comme ca :


 
Oui ok j'ai fait un truc dans un style différent mais qui reviens a la même finalité et où la laison dynamique focntionne a merveille.
Merci a vous deux.
Je confirme alors ma théorie de ne pas pouvoir exporter une méthode d'une classe non décorée.

Reply

Marsh Posté le 23-08-2004 à 12:35:23    

Harkonnen a écrit :

mais c'est particulièrement crade :heink:


 
Je suis d'accord c'est crade  c'est pourquio j'utilise une autre méthode actuellement avec des fonctions de liaison.
C'est aussi parce que c'est crade que je demande comment faire pour que les méthodes de la classe ne  soient pas  décorées.
MERCI ++

Reply

Marsh Posté le 23-08-2004 à 12:37:36    

TouperTinois a écrit :

Je suis d'accord c'est crade  c'est pourquio j'utilise une autre méthode actuellement avec des fonctions de liaison.
C'est aussi parce que c'est crade que je demande comment faire pour que les méthodes de la classe ne  soient pas  décorées.
MERCI ++

ben tu reproches quoi à ma méthode :??:
en plus, si tu pars de ma manip, t'as très peu de boulot à rajouter pour faire de ta dll un serveur COM, te permettant ainsi d'utiliser la dll à partir de n'importe quel langage


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

Marsh Posté le 23-08-2004 à 12:41:09    

TouperTinois a écrit :

Voila dans ce cas les méthodes s'exportent bien mais elles sont décorées.Je voudraient qu'elles ne soient pas décorées pour faire de la liaison dynamique dessus derrière.


 
Pourquoi voulez-vous faire de la liaison dynamique avec les méthodes d'une classe?

Reply

Marsh Posté le 24-08-2004 à 15:34:06    

DocMaboul a écrit :

Pourquoi voulez-vous faire de la liaison dynamique avec les méthodes d'une classe?


 
Si j'exporte ma classe je souhaite apres utiliser les méthodes de ma classe, ce qui est assez normal a priori.
Or leur nom décoré pose un probleme en cas de liaison dynamique à l'utilisation de la DLL.

Reply

Marsh Posté le 24-08-2004 à 15:52:56    

TouperTinois a écrit :

Si j'exporte ma classe je souhaite apres utiliser les méthodes de ma classe, ce qui est assez normal a priori.
Or leur nom décoré pose un probleme en cas de liaison dynamique à l'utilisation de la DLL.


 
je sais bien mais pourquoi êtes-vous obligé de charger la dll dans le courant de l'exécution?

Reply

Sujets relatifs:

Leave a Replay

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