2012-09-16 1 views
2

J'essaye de porter le Win32::Setupsup, un vieux module C++ plutôt croustillant destiné à fonctionner avec Visual C++, à Strawberry Perl et au MinGW GCC qu'il utilise. Je l'ai presque réussi à travailler, sauf pour une chose.Pourquoi Strawberry Perl n'appelle pas mon DllMain?

La partie C++ du module a une fonction DllMain qui exécute du code d'initialisation à DLL_PROCESS_ATTACH et code de nettoyage à DLL_PROCESS_DETACH. Lorsque je compile le module avec Visual C++, cela fonctionne très bien. Mais quand je le compile avec le MinGW GCC que Strawberry Perl utilise, DllMain n'est jamais appelé.

Je pense que le problème est juste que DllMain n'est pas correctement identifié comme point d'entrée de la DLL lorsqu'il est compilé avec gcc. Mais je ne sais pas comment réparer ça.

Le work-in-progress est en my GitHub repo for Win32::Setupsup. Bien que j'utilise Dist::Zilla pour gérer les versions, vous n'avez pas réellement besoin de dzil pour le tester. Juste cloner le repo, perl Makefile.PL, et dmake test.

+1

Est-ce que ['extern" C "'] (http://news.gmane.org/find-root.php?message_id=%3c200306030033.51176.hg%40technosis.de%3e) aide? – ephemient

+0

@ephemient, ça l'a fait! Et cela ne semble pas déranger Visual C++ non plus. Ecrivez ça comme une réponse, et je l'accepterai. – cjm

Répondre

2

En regardant votre code, vous avez

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved); 

dans un fichier source C++. Parce que ceci est une fonction C++, G ++ confronte le nom à quelque chose comme [email protected], et il ne peut pas être trouvé lorsque la bibliothèque est chargée.

Pour résoudre ce problème, utilisez extern "C", que ce soit sur la déclaration de fonction

extern "C" 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved); 

ou dans un bloc

extern "C" { 
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved); 
} 

pour faire en sorte que la fonction est donnée liaison C (évitant C++ nom mangling).

Questions connexes