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#@@@@")
Alternativement, pour obtenir automatiquement le nom de la fonction décorée :
#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)
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();
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!