Comment spécifier la fonction dll onload pour mingw32?

Je peux comstackr correctement les DLL en utilisant mingw et effectuer les opérations d’import / export. Ce que je recherche, c’est de définir correctement la fonction dll onload comme vous le feriez dans les produits MS VC. Google n’a rien révélé. Quelqu’un a une idée ou un lien vers un tutoriel?

Ok, alors après quelques manipulations … ça marche. Pour quiconque a des problèmes ici, c’est. Mes problèmes ne concernaient pas la compilation au lieu du chargement dynamic. C’était un mélange de quelques tutoriels / questions / procédures qui m’a amené à ce point.

dll.c

#include  #include  #include "dll.h" //extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD Reason, LPVOID LPV) { //This one was only necessary if you were using a C++ comstackr BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // Code to run when the DLL is loaded printf ("Load working...\n"); break; case DLL_PROCESS_DETACH: // Code to run when the DLL is freed printf ("Unload working...\n"); break; case DLL_THREAD_ATTACH: // Code to run when a thread is created during the DLL's lifetime printf ("ThreadLoad working...\n"); break; case DLL_THREAD_DETACH: // Code to run when a thread ends normally. printf ("ThreadUnload working...\n"); break; } return TRUE; } EXPORT void hello(void) { printf ("Hello\n"); } 

dll.h

 #ifndef DLL_H_ #define DLL_H_ #ifdef BUILD_DLL /* DLL export */ #define EXPORT __declspec(dllexport) #else /* EXE import */ #define EXPORT __declspec(dllimport) #endif EXPORT void hello(void); #endif /* DLL_H_ */ 

Bonjour c

 #include  #include  int main () { /*Typedef the hello function*/ typedef void (*pfunc)(); /*Windows handle*/ HANDLE hdll; /*A pointer to a function*/ pfunc hello; /*LoadLibrary*/ hdll = LoadLibrary("message.dll"); /*GetProcAddress*/ hello = (pfunc)GetProcAddress(hdll, "hello"); /*Call the function*/ hello(); return 0; } 

quand compilé avec

 gcc -c -DBUILD_DLL dll.c gcc -shared -o message.dll dll.o -Wl,--out-implib,libmessage.a gcc -c hello.c gcc -o hello.exe hello.o message.dll 

produit le résultat attendu de

 Load working... Hello Unload working... 

Puisque mingw est simplement un port Windows de GCC et des outils associés, vous pouvez utiliser les atsortingbuts constructeur et destructeur GCC . Celles-ci fonctionnent à la fois pour les bibliothèques partagées et statiques, et pour l’exécution du code avant et après l’exécution de main, respectivement. De plus, vous pouvez spécifier plusieurs fonctions de constructeur et de destructeur par bibliothèque.

 static void __atsortingbute__((constructor)) your_lib_init(void) { fprintf(stderr, "library init\n"); } static void __atsortingbute__((destructor)) your_lib_destroy(void) { fprintf(stderr, "library destroy\n"); }