Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1745 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [DLL] probleme export d'une classe en DLL

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[DLL] probleme export d'une classe en DLL

n°829234
TouperTino​is
Posté le 23-08-2004 à 09:47:38  profilanswer
 

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.
 
++

mood
Publicité
Posté le 23-08-2004 à 09:47:38  profilanswer
 

n°829245
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-08-2004 à 10:02:32  profilanswer
 

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)
n°829259
TouperTino​is
Posté le 23-08-2004 à 10:11:28  profilanswer
 

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.

n°829291
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-08-2004 à 10:38:09  profilanswer
 

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)
n°829312
TouperTino​is
Posté le 23-08-2004 à 10:58:08  profilanswer
 

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
n°829314
TouperTino​is
Posté le 23-08-2004 à 10:58:24  profilanswer
 

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
n°829318
chrisbk
-
Posté le 23-08-2004 à 11:05:15  profilanswer
 

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

n°829322
blackgodde​ss
vive le troll !
Posté le 23-08-2004 à 11:07:13  profilanswer
 

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 )-
n°829327
TouperTino​is
Posté le 23-08-2004 à 11:09:13  profilanswer
 

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 !!

n°829329
chrisbk
-
Posté le 23-08-2004 à 11:12:59  profilanswer
 

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.

mood
Publicité
Posté le 23-08-2004 à 11:12:59  profilanswer
 

n°829334
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-08-2004 à 11:22:04  profilanswer
 

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)
n°829353
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-08-2004 à 11:32:30  profilanswer
 

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)
n°829497
TouperTino​is
Posté le 23-08-2004 à 12:28:21  profilanswer
 

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.

n°829509
TouperTino​is
Posté le 23-08-2004 à 12:35:23  profilanswer
 

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 ++

n°829512
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-08-2004 à 12:37:36  profilanswer
 

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)
n°829518
docmaboul
Posté le 23-08-2004 à 12:41:09  profilanswer
 

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?

n°830886
TouperTino​is
Posté le 24-08-2004 à 15:34:06  profilanswer
 

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.

n°830900
docmaboul
Posté le 24-08-2004 à 15:52:56  profilanswer
 

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?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [DLL] probleme export d'une classe en DLL

 

Sujets relatifs
probleme avec un formulaire et liste deroulanteprobleme avec mysql
[ovh] probleme sécurité[résolu] problème avec iframe
Probleme avec un $_GET...enfin je crois...ORA-01691: probleme de tablespace avec les blobs
[Caml] Probleme resolution fonctionProblème de script sous IE
Problème de headerProbleme de programmation unix et stdarg.h
Plus de sujets relatifs à : [DLL] probleme export d'une classe en DLL


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR