Maison > développement back-end > C++ > Pourquoi les noms de fonctions exportés des DLL C sont-ils parfois décorés et comment puis-je exporter des noms non décorés ?

Pourquoi les noms de fonctions exportés des DLL C sont-ils parfois décorés et comment puis-je exporter des noms non décorés ?

Patricia Arquette
Libérer: 2024-11-12 09:30:02
original
740 Les gens l'ont consulté

Why are C   DLL exported function names sometimes decorated, and how can I export undecorated names?

Exportation de DLL C : noms décorés/modifiés

Dans le développement de DLL C, il est prévu que les noms de fonctions exportés apparaissent sans décoration après la compilation. Cependant, rencontrer des noms de fonctions décorés avec des caractères supplémentaires peut soulever des inquiétudes.

Cause de la décoration

La décoration vue est le résultat du processus de modification du nom du compilateur. Lors de la compilation du code C, le compilateur modifie les noms de fonctions pour garantir l'unicité des fonctions surchargées ou des différentes unités de compilation. Cette modification inclut des caractères et des symboles supplémentaires.

Solution utilisant le commentaire Pragma

Pour exporter des noms de fonctions non décorés, sans utiliser de fichier de définition de module, un commentaire pragma peut être inséré :

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
Copier après la connexion

Alternativement, pour obtenir automatiquement le nom de la fonction décorée :

#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)
Copier après la connexion

Externe équivalent "C" avec spécificateur de déclaration

Une autre approche consiste à utiliser extern "C" avec un spécificateur de déclaration :

extern "C" void __declspec(dllexport) SomeFunction();
Copier après la connexion

Cependant, cette méthode aboutit toujours au même nom de fonction décoré.

Élimination du suffixe

Malheureusement, la décoration post "=" ne peut pas être éliminée sans utiliser un fichier de définition de module ou un commentaire pragma. Ce suffixe indique la version décorée de la fonction.

Solution de contournement pour les applications C#

Bien que les noms non décorés soient préférés, les appels P/Invoke en C# peuvent toujours être effectués en utilisant le nom de la fonction décorée. Pour ce faire, incluez le nom entièrement décoré lors de l'appel de la fonction.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal