probleme export d'une classe en DLL [DLL] - C++ - Programmation
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
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. |
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.
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 :
|
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.
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.
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é.
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
Marsh Posté le 23-08-2004 à 11:07:13
je pense qu'Harko pensait a un truc comme ca :
partie commune :
Code :
|
dans la dll :
Code :
|
dans l'exe
Code :
|
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 !!
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.
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
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
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.
Marsh Posté le 23-08-2004 à 12:35:23
Harkonnen a écrit : mais c'est particulièrement crade |
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 ++
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. |
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
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?
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.
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. |
je sais bien mais pourquoi êtes-vous obligé de charger la dll dans le courant de l'exécution?
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.
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.
++