Bonjour
je cherche à créer une dll contenant une classe. Malheureusement les noms référencé dans la dll sont de type _zntoto
je voudrais avoir un naming type toto::toto(void)
comment faire?
Version imprimable
Bonjour
je cherche à créer une dll contenant une classe. Malheureusement les noms référencé dans la dll sont de type _zntoto
je voudrais avoir un naming type toto::toto(void)
comment faire?
Les DLL ne peuvent contenir que du code "C", elles n'ont pas de notion d'objet, cette notion est gérée par le compilateur uniquement, au moment de créer la DLL.
A moins que ton besoin soit un peu différent. Où est ce que tu bloques exactement ?
je voudrais une dll contenant les membres suivants:
public __thiscall toto::toto(void)
public __thiscall toto::~toto(void)
public int __thiscall toto::mamethode(void)
lorsque je compile ma class toto et que j'inspecte la dll générée, j'ai
_ZN15totoC1Ev
...
C'est donc un problème de nommage dans la dll
Les noms tels que vus par les editeurs de liens sont contraints et ne peuvent pas contenir n'importe quel caractere. Pour cette raison -- et d'autres aussi -- les compilateurs encodent le nom ainsi que les caracteristiques permettant de le rendre unique (namespace englobant, classe, prototype, etc, je doute que la visibilite en fasse partie) en n'utilisant que des caracteres autorises par l'editeur de liens, processus appele en francais decoration des noms et bien plus connu sous le nom anglais de name mangling.
_ZN15totoC1Ev encode vraisemblablement toto::toto(void)
La decoration des noms fait partie de l'ABI, chose plus large comprenant aussi la maniere dont les exceptions sont generees, l'alignement a utilise pour les types, la maniere dont on retrouve les fonctions virtuelles, etc. C'est expres que des ABI differentes utilisent des decorations de noms differentes, ca permet de detecter des l'edition de liens une incompatibilite qui autrement pourrait n'etre visible que par des problemes d'execution plus ou moins subtils.
Ca risque d'être compliqué. Alors.
En fait je voudrais remplacer une dll existante par mon propre code.
Et évidemment je voudrais que le programme hôte retrouve tous ses petits
Y a t il une autre solution pour y arriver? Sachant que je nvai pas le code source du programme hôte
Et comment tu fais si il y avait des fonctions inlinees? Ca necessite de savoir beaucoup sur la DLL. Reussir a faire des composants interchangables demande en general de concevoir le composant pour ca, en documentant... l'ABI du composant. Si ca n'a pas ete fait, c'est dur, et encore plus si tu n'as pas les sources.