如何为mingw32指定dll onload函数?

我可以使用mingw正确编译DLL并执行导出/导入操作。 我正在寻找的是正确定义dll onloadfunction,就像在MS VC产品中一样。 谷歌没有发现任何事情。 任何人有任何想法或指向教程的链接?

好吧,经过一些摆弄……所以它正在发挥作用。 对于其他任何有问题的人来说,这是。 我的问题与编译无关,而不是动态加载。 这是几个教程/问题/方法的混搭让我达到了这一点。

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++ compiler 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_ */ 

你好ç

 #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; } 

编译时

 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 

产生预期的产量

 Load working... Hello Unload working... 

由于mingw只是GCC的Windows端口和相关工具,因此您可以使用GCC构造函数和析构函数属性 。 这些工作分别用于共享库和静态库,并分别在main运行之前和之后执行代码。 此外,您可以为每个库指定多个构造函数和析构函数。

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