FreeLibrary() direct nach LoadLibrary() lässt Programm abstürzen ??
-
Guten Tag, ich habe in etwa folgenden Code :
while(Bedingung){ HMODULE MathDll = LoadLibrary("Math.dll"); //Funktionen der dll werden genutzt FreeLibrary(MathDll); }
Das Problem ist, dass das Programm so sofort abstürzt.
Wenn ich aber nach
HMODULE MathDll = LoadLibrary("Math.dll");
und nach
FreeLibrary(MathDll);
Sleep(100);
einfüge, tritt das Problem nicht auf und das Programm läuft einwandfrei.
Woran könnte das liegen??
-
Ist nicht das WinAPI-Forum, bitte verschieben.
@Topic: Race-condition. Irgendwo werden noch auf Funktionen des Handles zugegriffen, und wenn die Threads nicht abgearbeitet sind, werden die DLL-Speichermappings wieder freigegeben und der Code produziert unerlaubte Speicherzugriffe.
Das wäre zumindest meine allererste Vermutung.
-
Welcher zweiter Thread sollte denn auf Daten der DLL zugreifen ?
Das Programm nutzt nur einen Thread, nutzt Windows Intern für API Funktionen mehrere Threads ?
-
lulle2007200 schrieb:
Welcher zweiter Thread sollte denn auf Daten der DLL zugreifen ?
Das Programm nutzt nur einen Thread, nutzt Windows Intern für API Funktionen mehrere Threads ?Hast du nicht OpenMP-Code am Laufen in deinem Programm?
Wie das mit der Synchronisation bei OpenMP ist, kann ich dir nicht sagen. Aber dass Fehler nach dem Einbauen eines Delay verschwinden lässt bei mir immer die Race-Condition-Warnglocken klingeln bei mir.
-
lulle2007200 schrieb:
Welcher zweiter Thread sollte denn auf Daten der DLL zugreifen ?
Vielleicht einer den die DLL selbst startet?
Aber warum raten?
Ein reproduzierbarer Crash ist doch *optimal*, viel besser gehts kaum. Also was Fehlersuche angeht. Guck einfach nach was crasht. Debugger und so. Falls du keinen Plan hast wie man das macht google ein bisschen. Falls du's damit auch nicht hinbekommst, frag nochmal nach (Inklusive Angabe welche Entwicklungsumgebung du verwendest).
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ich habe das Problem gefunden.
In meiner DLL ist eine Funktion, welche Parallele (omp) schleifen verwendet.
-
Außerdem würde ich IMMER MathDll prüfen(Rückgabe von LoadLibrary)!
-
Da stimmt was mit der DLL nicht,
man kann natürlich sofort wieder entladen.Schau mal mit dependswalker nach, welche anderen DLL's diese
nachlädt, setze mal aus Spass ::SetCurrentDirectory()
auf den Pfad woher die DLL stammt.PS sollte der handle = null sein geht's kaputt bei unload...
Grüße
K.