stdcall nom de déformation à l'aide extern c et dllexport vs module de définitions (msvc++)
J'ai essayé d'exporter d'un simple test de la fonction d'une dll pour fonctionner avec une application (pour info: mIRC) qui spécifie la convention d'appel:
int __stdcall test_func(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)
Maintenant, pour appeler à partir de l'application, je serais en utilisant test_func mais j'ai remarqué en raison de name mangling il n'est pas aussi simple que je l'avais pensé.
À travers des sujets similaires ici, j'en suis venu à comprendre que l'utilisation de extern "C" en combinaison avec __declspec(dllexport) est une équivalence (un peu) la méthode de suppression d'une déformation de module de définitions.def). Cependant, lors de l'utilisation de la extern/dllexport méthode de ma fonction (par exemple) est toujours _test_func@numéros de alors que l' .def supprimé toutes les mutilations que nécessaire pour utiliser l'application, j'ai besoin d'exporter.
Quelqu'un pourrait-il expliquer pourquoi il en est? Je suis juste curieux de connaître les deux méthodes. Merci!
OriginalL'auteur mina | 2010-12-28
Vous devez vous connecter pour publier un commentaire.
dllexport/importation sont conçus pour être chargés par eux-mêmes, pas un vieux de la bibliothèque C à l'aide de GetProcAddress. Les mutilations que vous avez vu est ce que tous les compilateurs Microsoft ont fait depuis longtemps pour __stdcall fonctions. Très probablement, votre cible soit s'attend à un __cdecl de la fonction, non __stdcall, mais si pas, vous aurez besoin d'utiliser un .fichier def spécifiquement de l'onu-mangle le nom.
OriginalL'auteur Puppy
extern "C"
n'a rien à voir avec stdcall: il ne déclare que le C++ name mangling (alias de type liaison sûre; l'intégration de l'information de type de nom de symbole) est désactiver. Vous avez besoin de l'utiliser indépendamment de savoir si vous utiliser la convention d'appel C ou convention d'appel stdcall.Dans la convention d'appel stdcall, le destinataire de l'appel supprime les paramètres de la pile. Pour faire le coffre, le nom exporté contient le nombre d'octets que le destinataire de l'appel sera retirer de la pile.
Si l'application que vous exportez vers nécessite pas de
@number
suffixe est ajouté au nom, cela signifie probablement qu'il attend de la convention d'appel C. Donc, vous devez arrêter de déclarer la fonction comme__stdcall
. Lorsque vous le déclarer commedeclspec(dllexport)
, vous devez obtenir un nom non décoré dans la DLL.Dans le fichier DEF, vous pouvez appeler la fonction de ce que vous voulez; aucune autre vérification n'est effectuée.
OriginalL'auteur Martin v. Löwis