OVH Cloud OVH Cloud

DLL : Export de class

8 réponses
Avatar
Thierry
Bonjour,

J'ai une classe dans module (.cpp + .h) que je veux exporter dans une DLL.
La methode habituelle veut qu'on fasse
#ifdef MADLL_EXPORTS
#define MADLL_API __declspec(dllexport)
#else
#define MADLL_API __declspec(dllimport)
#endif

class MADLL_API MaClasse
{
};

or j'aimerai ne pas modifier le .h pour pouvoir reutiliser cette classe
dans d'autres projets.

C'est possible ?
J'ai essayé :
- class __declspec(dllexport) MaClass; dans un autre .cpp de la DLL
Ca compile mais n'exporte pas.
- Declarer MaClass dans un .def
-> error LNK2001: unresolved external symbol MaClass

A priori tout exportation doit être possible dans un .def, mais comment
faire pour exporter une classe ?

--
« Le travail est probablement ce qu'il y a sur cette terre de plus bas et
de plus ignoble. Il n'est pas possible de regarder un travailleur sans
maudire ce qui a fait que cet homme travaille, alors qu'il pourrait nager,
dormir dans l'herbe ou simplement lire ou faire l'amour avec sa femme. »
Boris VIAN
>> Mon blog RSS : http://yarglah.free.fr/monblog_rss.php <<

8 réponses

Avatar
xavier
Thierry a dis le 05/01/2005 14:01:
C'est possible ?



#ifndef MADLL_NO_EXPORT
# ifdef MADLL_EXPORTS
# define MADLL_API __declspec(dllexport)
# else
# define MADLL_API __declspec(dllimport)
# endif
#else
# define MADLL_API
#endif
Avatar
Thierry
Bonjour,

Salut Xtroch, ca roule ?

#ifndef MADLL_NO_EXPORT
# ifdef MADLL_EXPORTS
# define MADLL_API __declspec(dllexport)
# else
# define MADLL_API __declspec(dllimport)
# endif
#else
# define MADLL_API
#endif



Ca resoud pas le pb, a savoir l'obligation de modifier la declaration de la
classe.

Question subsidiaire : comment exporter deux fonctions de même nom mais de
proto différents.

--
« Le travail est probablement ce qu'il y a sur cette terre de plus bas et
de plus ignoble. Il n'est pas possible de regarder un travailleur sans
maudire ce qui a fait que cet homme travaille, alors qu'il pourrait nager,
dormir dans l'herbe ou simplement lire ou faire l'amour avec sa femme. »
Boris VIAN
Mon blog RSS : http://yarglah.free.fr/monblog_rss.php <<




Avatar
xavier
Thierry a dis le 05/01/2005 17:28:
Ca resoud pas le pb, a savoir l'obligation de modifier la declaration de la
classe.
Question subsidiaire : comment exporter deux fonctions de même nom mais de
proto différents.




Ces deux problèmes requierent une connaissance correcte de l'ABI
utilisée par le compilateur, en particulier le "name mangling".
En gros, il n'est pas envisageable de le faire manuellement.
Avatar
Arnaud Debaene
Thierry wrote:
Bonjour,

J'ai une classe dans module (.cpp + .h) que je veux exporter dans une
DLL. La methode habituelle veut qu'on fasse
#ifdef MADLL_EXPORTS
#define MADLL_API __declspec(dllexport)
#else
#define MADLL_API __declspec(dllimport)
#endif

class MADLL_API MaClasse
{
};

or j'aimerai ne pas modifier le .h


Comment ca ne pas modifier le .h? Tu veux dire que tu as un .h déjà écrit et
que tu ne veux pas rajouter les define qui vont bien comme tu as indiqué,
c'est çà?

A priori tout exportation doit être possible dans un .def, mais
comment faire pour exporter une classe ?


Il faut exporter les noms manglés de toutes les méthodes et propriétés
public et protected de la classe (plus les fonctions friend, les operateurs,
etc...).
Autrement dit c'est un cauchemar de maintenance et une mauvaise idée : pour
voir les noms manglés, fait une DLL qui exporte effectivement la classe
avec__declspec(dllexport) et ouvre la dans Dependency Walker. Ca répondra
également à ta question concernant la surcharge de méthode.

Arnaud
Avatar
Thierry
Bonjour,

Arnaud Debaene a écrit :

idée : pour
voir les noms manglés, fait une DLL qui exporte effectivement la classe
avec__declspec(dllexport) et ouvre la dans Dependency Walker.



J'avais fait un prog pour voir le proto a partir du nom manglé (je
connaissais pas l'API UnDecorateSymbolName), ca doit pas être compliqué
de faire l'inverse.

Mais bon, ca reste quand même chiant a maintenir.

--
« Le travail est probablement ce qu'il y a sur cette terre de plus bas et
de plus ignoble. Il n'est pas possible de regarder un travailleur sans
maudire ce qui a fait que cet homme travaille, alors qu'il pourrait nager,
dormir dans l'herbe ou simplement lire ou faire l'amour avec sa femme. »
Boris VIAN
Mon blog RSS : http://yarglah.free.fr/monblog_rss.php <<




Avatar
Thierry
Bonjour,

Arnaud Debaene a écrit :

or j'aimerai ne pas modifier le .h


Comment ca ne pas modifier le .h? Tu veux dire que tu as un .h déjà
écrit et que tu ne veux pas rajouter les define qui vont bien comme tu
as indiqué, c'est çà?



Oui.

A priori tout exportation doit être possible dans un .def, mais
comment faire pour exporter une classe ?


Il faut exporter les noms manglés de toutes les méthodes et propriétés
public et protected de la classe (plus les fonctions friend, les
operateurs, etc...).
Autrement dit c'est un cauchemar de maintenance et une mauvaise idée :
pour voir les noms manglés, fait une DLL qui exporte effectivement la
classe avec__declspec(dllexport) et ouvre la dans Dependency Walker.



Aïe. Ok, merci pour l'explication.

Ca répondra également à ta question concernant la surcharge de
méthode.



C'etait pas une méthode mas des fonctions d'un autre module.
Je suppose que c'est pareil.

--
« Le travail est probablement ce qu'il y a sur cette terre de plus bas et
de plus ignoble. Il n'est pas possible de regarder un travailleur sans
maudire ce qui a fait que cet homme travaille, alors qu'il pourrait nager,
dormir dans l'herbe ou simplement lire ou faire l'amour avec sa femme. »
Boris VIAN
Mon blog RSS : http://yarglah.free.fr/monblog_rss.php <<




Avatar
adebaene
Thierry wrote:
Bonjour,

Arnaud Debaene a écrit :

> idée : pour
> voir les noms manglés, fait une DLL qui exporte effectivement la


classe
> avec__declspec(dllexport) et ouvre la dans Dependency Walker.

J'avais fait un prog pour voir le proto a partir du nom manglé (je
connaissais pas l'API UnDecorateSymbolName), ca doit pas être


compliqué
de faire l'inverse.



Sauf que c'est dépendant du compilateur utilisé...
(UndecorateSymbolName ne comprend que les noms de VC)

Arnaud
Avatar
Thierry
Bonjour,

Arnaud Debaene a écrit :

Il faut exporter les noms manglés de toutes les méthodes et propriétés
public et protected de la classe (plus les fonctions friend, les
operateurs, etc...).



Je viens d'essayer avec mes fonction de même proto, et ca link pas (la DLL
contenant ces fonctions):
MaDLL.exp : error LNK2001: unresolved external symbol mon_proto@@
MaDLL.exp : error LNK2001: unresolved external symbol
mon_proto@@YGGPBUmachdr@@@Z

Ca ne m'etonne pas trop, @ etant reserve pour definir l'ordinal.

--
« Le travail est probablement ce qu'il y a sur cette terre de plus bas et
de plus ignoble. Il n'est pas possible de regarder un travailleur sans
maudire ce qui a fait que cet homme travaille, alors qu'il pourrait nager,
dormir dans l'herbe ou simplement lire ou faire l'amour avec sa femme. »
Boris VIAN
Mon blog RSS : http://yarglah.free.fr/monblog_rss.php <<