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.