Code::Blocks - dll erzeugen



  • Hi,

    ich nutze die IDE Code::Blocks mit dem Compiler mingw.
    Wenn ich diesen Code mit CodeBlocks kompiliere und die .dll anschließen in einen Prozess injecte, kommt nicht eine Message Box..

    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                MessageBox ( NULL , "ATTACHED!" , "MB", MB_ICONINFORMATION );
                break;
    
            case DLL_PROCESS_DETACH:
                MessageBox ( NULL , "DETACHED!" , "MB", MB_ICONINFORMATION );
                break;
    
            case DLL_THREAD_ATTACH:
                MessageBox ( NULL , "THREAD ATTACHED!" , "MB", MB_ICONINFORMATION );
                break;
    
            case DLL_THREAD_DETACH:
                MessageBox ( NULL , "THREAD DETACHED!" , "MB", MB_ICONINFORMATION );
                break;
        }
        return TRUE;
    }
    

    Wenn ich den gleichen Code aber mit MSVC++ kompiliere klappt alles o0

    Wo ist da mein Problem ?



  • Lösung:

    extern "C"
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
    { 
        switch (fdwReason) 
        { 
            case DLL_PROCESS_ATTACH: 
                MessageBox ( NULL , "ATTACHED!" , "MB", MB_ICONINFORMATION ); 
                break; 
    
            case DLL_PROCESS_DETACH: 
                MessageBox ( NULL , "DETACHED!" , "MB", MB_ICONINFORMATION ); 
                break; 
    
            case DLL_THREAD_ATTACH: 
                MessageBox ( NULL , "THREAD ATTACHED!" , "MB", MB_ICONINFORMATION ); 
                break; 
    
            case DLL_THREAD_DETACH: 
                MessageBox ( NULL , "THREAD DETACHED!" , "MB", MB_ICONINFORMATION ); 
                break; 
        } 
        return TRUE; 
    }
    


  • Oh das klappt super, danke 😛

    Aber wieso ist das extern "c" nötig und bei msvc++ nicht ?
    Bzw. was bewirkt das überhaupt ?
    Bedeutet das nicht einfach nur das der Code auch C kompatibel ist ?



  • Such im Forum mal nach Namemangling:
    Das "extern C" wird benötigt, damit der MINGW die Funktion richtig erkennt. Denn bei C++ wird immer etwas zum Namen hinzugefügt.
    So wird aus "DllMain" gerne mal "@@DLLMain01@$%".
    extern "C" verhindert das. Beim MSVC ist das eingebaut, dass diese Funktionen nicht gemangelt werden.
    rya.



  • Alles klar, danke.

    // Edit

    Ich habe jetzt mal eine .dll mit Funktionen geschrieben und die dann mit einem anderen Programm geladen.
    Dann habe ich mal (um zu gucken was passiert) die Präprozessor Direktiven weggelassen:

    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
    

    und das DLL_EXPORT vor den Funktionen ebenfalls weggelassen.

    Hat aber trotzdem prima geklappt -.-
    Macht der Compiler das schon automatisch ?


Anmelden zum Antworten