Search code examples
cdllmingwonloadmingw32

How to specify dll onload function for mingw32?


I can compile DLLs properly using mingw and do the exports/imports stuff. What I am looking for is defining the dll onload function properly as you would in MS VC products. Google didn't turn up anything. Anyone have any ideas or a link to a tutorial?


Solution

  • Okay, so after some fiddling...it's working. For anyone else that is having issues here it is. My issues weren't related to compiling in instead of loading dynamically. It was a mash-up of a couple of tutorial/question/how-tos that got me to this point.

    dll.c

    
    #include <stdio.h>
    #include <windows.h>
    #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_ */
    

    hello.c

    
    #include <windows.h>
    #include <stdio.h>
    
    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;
    }
    

    when compiled with

    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
    

    produces the expected output of

    Load working...
    Hello
    Unload working...