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 <<
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 <<
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 <<
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 <<
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.
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.
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.
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
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.
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
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 <<
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 <<
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 <<
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 <<
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 <<
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 <<
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
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)
> 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
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 <<
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@@YGGPBE@Z
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 <<
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 <<