Rechercher une fonction de nom mutilé dans une dll chargée dynamicment

J’ai un ensemble d’API explicitement conçu pour être utilisé uniquement en C ++. Je ne m’attends pas à ce qu’ils soient utilisés par un programme C (ni par aucun autre langage d’ailleurs) et, en tant que tel, j’exporte les informations sur les espaces de noms et les classes, par opposition à la route extern "C" et à l’utilisation des fonctions utilitaires intégrées Fonctions C.

Pour le moment, je ne travaille que sur des dll liées au moment de la compilation, ce qui signifie que l’importation des fonctions dans l’exécutable est très simple, car cela ne nécessite aucun travail de ma part. Cependant, je prévois de développer un système de plug-in qui nécessitera que je charge des dll dynamicment au moment de l’exécution. Est-ce que je pourrai trouver des fonctions C ++ dont le nom est mutilé à l’aide de GetProcAddress() ?

Ce que vous faites n’est pas nécessairement une bonne idée si vous ne contrôlez pas la totalité de la chaîne de construction et ne pouvez vous assurer que votre DLL et toutes les applications qui l’utilisent sont construites avec la même version du même compilateur.

Cela dit, vous pouvez charger des fonctions avec nom GetProcAddress aide de GetProcAddress . Utilisez simplement Dependency Walker ou consultez le fichier .def généré pour votre DLL, si votre compilateur est configuré pour en produire un, afin d’obtenir le nom de la fonction mutilée. Ensuite, vous pouvez obtenir GetProcAddress . Cependant, vous ne pouvez pas appeler GetProcAddress avec un nom non démêlé et vous attendre à ce qu’il trouve le bon nom mutilé. Par exemple, si la fonction de votre DLL s’appelle Add et qu’elle est _Z3Addv en _Z3Addv , vous devez appeler GetProcAddress(myDLL, "_Z3Addv"); pour accéder à la fonction correctement.

Vous devrez changer l’appel en GetProcAddress chaque fois que vous modifiez la déclaration de votre fonction, car le nom mutilé changerait également. Sachez que vous aurez également besoin de modifier l’appel GetProcAddress si vous modifiez le compilateur avec lequel votre DLL a été générée. Le comportement de MSVC est très différent de celui de GCC et celui de Clang est probablement différent des deux. Donc, vous voudrez peut-être reconsidérer votre façon de faire, car cela semble plutôt enclin à se briser quelque part en cours de route.