Fonctions surchargées dans le fichier def DLL C ++
Je suis en train d'écrire une DLL C/C++ et souhaitez exporter certaines fonctions que j'ai fait avant de l'utiliser .def fichier comme ceci
LIBRARY "MyLib"
EXPORTS
Foo
Bar
avec le code défini comme ceci, par exemple:
int Foo(int a);
void Bar(int foo);
Cependant, que faire si je veux déclarer une méthode surchargée de Foo() comme:
int Foo(int a, int b);
Que le fichier def a seulement le nom de la fonction et non la totalité du prototype je ne vois pas comment il serait en mesure de gérer les fonctions surchargées. Ne vous utilisez simplement la première entrée, puis spécifier la version surchargée vous voulez lors du passage dans le prototype de la fonction pointeur de la fonction LoadLibrary() ?
Edit: Pour être clair, c'est sur Windows à l'aide de Visual Studio 2005
Edit: Marqué le non-def (__declspec) méthode comme la réponse...je sais que cela ne fait pas de résoudre le problème à l'aide de def fichiers que je voulais, mais il semble qu'il n'y a aucune chance (officiel) de la solution à l'aide de def fichiers. Sera de laisser la question ouverte, cependant, dans le cas où quelqu'un sait quelque chose que nous n'avons pas les fonctions surchargées et def fichiers.
source d'informationauteur Adam Haile
Vous devez vous connecter pour publier un commentaire.
Dans le code lui-même, de la marque les fonctions que vous voulez exporter à l'aide de __declspec(dllexport). Par exemple:
Si vous faites cela, vous n'avez pas besoin d'énumérer les fonctions dans les .fichier def.
Sinon, vous pouvez peut-être utiliser une valeur de paramètre par défaut, comme:
Cela suppose qu'il existe une valeur pour b que vous pouvez utiliser pour indiquer qu'il est inutilisé. Si -1 est une valeur juridique pour b, ou si il n'est pas ou ne devrait pas être un défaut, cela ne fonctionne pas.
Modifier (Adam Haile): correction de l'utilisation de __declspec qu' __dllspec n'était pas correcte pour que je puisse marquer ce que la réponse officielle...c'était assez proche.
Modifier (Graeme): Oops - merci pour la correction de mes fautes de frappe!
De surcharge de fonctions est en C++ une fonction qui s'appuie sur le nom d'amputation (cryptiques noms de fonction dans l'éditeur de liens des messages d'erreur).
Par écrit les noms déformés dans le fichier def, je peux obtenir mon projet de test de lien et de l'exécuter:
semble fonctionner pour
Pour copier les noms de fonction C++ à partir du message d'erreur et l'écrire dans le fichier def. Cependant, la vraie question est: Pourquoi voulez-vous utiliser un fichier def et ne pas aller avec __declspec(dllexport) ?
Les noms déformés sont non-portable, j'ai testé avec VC++ 2008.
J'ai eu un problème similaire, donc je voulais poster sur ce.
Généralement à l'aide d'
à l'exportation d'un nom de fonction est fine.
Il généralement exporter le nom de
unmangled sans la nécessité d'une
.fichier def. Il ya, cependant, certains
des exceptions comme le __stdcall fonctions
et surchargé des noms de fonction.
Si vous déclarez une fonction pour utiliser le
__stdcall convention (comme on le fait pour de nombreuses fonctions de l'API) puis
exporter une déformation d'un nom comme
_Foo@4. Dans ce cas, vous pouvez avoir besoin de mapper explicitement le nom exporté
pour un interne de déformation nom.
A. Comment exporter un unmangled nom. Dans une .fichier def ajouter
Ce va essayer de trouver une "meilleure correspondance" pour une fonction interne Foo et de l'exporter. Dans le cas ci-dessus où il y a seulement
un foo cela va créer le mappage
Foo = _Foo@4
comme on peut le voir via dumpbin EXPORTATIONS
Si vous avez surchargé d'un nom de fonction, alors vous pouvez avoir besoin de préciser explicitement de la fonction que vous voulez dans la .fichier def
en spécifiant un nom décomposé à l'aide de la entryname[=internalname] syntaxe. par exemple,
B. Une alternative .def fichiers, c'est que vous pouvez exporter des noms "à la place" à l'aide d'un #pragma.
C. Une troisième alternative consiste à déclarer qu'une version de Foo que extern "C" pour être exportés unmangled. Voir ici pour plus de détails.
Il n'existe pas de moyen de faire ce que vous voulez, parce que la dll d'interface est une api C.
Le compilateur lui-même utilise les noms déformés comme une solution, alors vous devriez utiliser le nom de déformation lorsque vous ne souhaitez pas trop changer dans votre code.
Il n'y a pas une langue ou d'une version de façon agnostique de l'exportation d'une fonction surchargée depuis les mutilations convention peut changer à chaque version du compilateur.
C'est une des raisons pourquoi la plupart des WinXX fonctions ont de drôles de noms, par exemple: *Ex ou *2.
Systax pour les EXPORTATIONS, la définition est la suivante:
entryname est la fonction ou le nom de la variable que vous souhaitez exporter. Cela est nécessaire. Si le nom de l'exportation est différent du nom de la DLL, de spécifier l'exportation du nom de la DLL avec internalname.
Par exemple, si votre fichier DLL exporte une fonction, func1() et que vous voulez qu'il soit utilisé comme func2(), vous pouvez spécifier:
Il suffit de voir les noms déformés (à l'aide de Dependency walker) et spécifier vos propres fonctions nom.
Source: http://msdn.microsoft.com/en-us/library/hyx1zcd3(v=vs. 71).aspx
Edit: Cela fonctionne pour les dynamiques Dll, où nous avons besoin d'utiliser GetProcAddress() explicitement chercher une des fonctions de la Dll.