64 Bit-DLL geht nicht



  • Hallo,

    ich habe folgendes Problem: Ich habe mir seit kurzem den MinGW 64 Bit (MinGW-builds o.ä.) heruntergeladen und wollte eine DLL erstellen (64 Bit natürlich).

    DLL.cpp:

    #define DLL_export extern "C" __declspec(dllexport)
    
    DLL_export void test(){
       Beep(500,500);
       return;
    };
    

    Die beiden Konsolenbefehle für die DLL:

    g++ -c -std=c++11 -w -D BUILDING_DLL DLL.cpp
    g++ -o DLL.dll DLL.o -shared -static-lingcc -static-libstdc++
    

    Und zum Schluss das Testprogramm:

    int main(){
       using pro_test=void(*)();
       pro_test f_test={0};
       {
          Module DLL("\\DLL.dll"); // nichts anderes wie "LoadLibrary"
          f_test=DLL.address<pro_test>("test"); // nichts anderes wie "GetProcAddress"
       };
       f_test(); // CRASH !
       return 0;
    };
    

    Die DLL wird erstellt, aber das Programm stürzt ab!Wo liegt der Fehler? Mit rundll32.exe kann ich die Funktion erfolgreich ausführen (es piept 🤡 ).

    Danke im Voraus!

    MfG

    Seikuassi



  • Der Destruktor von Module wird wohl "nichts anderes als FreeLibrary" sein.
    DLL freigeben und dann DLL-Funktion aufrufen == Crash.
    Probiers mal anders rum.



  • Hallo hustbaer,

    du hattest Recht. Aber eine Sache verstehe ich nicht so ganz,denn folgender Code funktioniert:

    using pro_Beep=void(WINAPI*)(unsigned long,unsigned long);
    HMODULE handle=LoadLibrary("kernel32.dll");
    pro_Beep f_Beep=reinterpret_cast<pro_Beep>(GetProcAddress(handle,"Beep"));
    FreeLibrary(handle); // funktioniert bei mir
    f_Beep(500,500);
    

    Warum geht das? Weil MinGW die Libraries (.lib) eh mit eingebunden hat? Bei mir stürzt das Programm immer mit eigenen DLL's ab.

    Danke im Voraus!

    MfG

    Seikuassi



  • Seikuassi schrieb:

    Warum geht das? Weil MinGW die Libraries (.lib) eh mit eingebunden hat?

    Jap; jede dll hat einen Referenzzähler und wird erst entladen, wenn dieser auf 0 fällt. Die .lib sorgt dafür, dass die .dll in die Import-Tabelle der .exe eingetragen wird. Könnte mir vorstellen, dass ein doppeltes FreeLibrary() ebenfalls zum Crash führt...



  • Seikuassi schrieb:

    Die DLL wird erstellt, aber das Programm stürzt ab!

    Dann machst du wohl was falsch.


Anmelden zum Antworten