FreeLibrary schlägt immer fehl?!
-
Ich habe ein Programm, in dem ich eine von mir erstellte DLL mit einigen mathematischen Funktionen lade (mit LoadLibrary).
Wenn ich nun versuche die DLL wieder zu entladen (mit FreeLibrary), schlägt die Funktion fehl, und der von GetLastError zurückgegebene Fehler ist 6, also "ERROR_INVALID_HANDLE". Wenn versuche die DLL erneut zu entladen, gibt GetLastError 126, ERROR_MOD_NOT_FOUND, zurück.Letzterer Fehler lässt doch eigentlich darauf schließen, dass die DLL erfolgreich entladen wurde ?!
-
lulle2007200 schrieb:
Wenn ich nun versuche die DLL wieder zu entladen (mit FreeLibrary), schlägt die Funktion fehl, und der von GetLastError zurückgegebene Fehler ist 6, also "ERROR_INVALID_HANDLE".
Nur eine Vermutung, ich hatte noch nie das Bedürfnis eine DLL zu entladen, habs also noch nie ausprobiert.
Dann ist ERROR_INVALID_HANDLE, fertig. Ich würde gar nix anderes suchen.
Warum haste den HANDLE kaputtgemacht?
Arraygrenzenüberschreitung beistruct Fab{ char foo[7]; HANDLE fibo; }; ... fob.foo[10]='z';//autsch
Irgend sowas vermutlicher als daß Win bei Handles spinnt.
-
Ich benutze keine Array.
//Irgendwelcher Code HMODULE DllHandle = LoadLibrary("Math.dll"); //Funktionen der dll werden genutzt FreeLibrary(DllHandle); HRESULT ErrCode = GetLastError(); //ErrCode ist beim ersten mal 6 (INVALID_HANDLE) FreeLibrary(DllHandle); ErrCode = GetLastError(); //ErrCode ist beim zweiten mal 126 (ERROR_MOD_NOT_FOUND)
Die DLL ist definitiv danach nicht entladen, da man von außerhalb des Programms keinen Schreibzugriff hat (wärend das Programm läuft)
-
Dann schreibst du irgendwo rein, wo du nicht reinschreiben sollst. Kommentier' mal stückweise den Code aus zwischen Laden und Freigeben der DLL.
Außerdem ist das hier nicht die WinAPI-Ecke.
-
//Struct mit Dll Handle, Funktionszeigern und "Statuswerten" typedef struct win32_lib{ HMODULE LibHandle; safe_div *SafeDiv; bool FunctionsAreLoaded; bool LibIsLoaded; }win32_lib; //füllt die übergebene Struktur internal error Win32_LoadLib(win32_lib *TargetLib) { //Wenn keine Dll geladen ist, dann... if (!TargetLib->LibIsLoaded) { TargetLib->LibIsLoaded = false; TargetLib->FunctionsAreLoaded = true; TargetLib->SafeDiv = SafeDivStub; //Dll laden TargetLib->LibHandle = LoadLibrary("Math.dll"); //Wenn Dll erfolgreich geladen, dann if (TargetLib->LibHandle) { TargetGameCode->LibIsLoaded = true; //Funktionszeiger setzen TargetLib->SaveDiv = (safe_div *)GetProcAddress(TargetLib->LibHandle, "SafeDiv"); //Wenn die Funktion nicht gefunden wurde, auf entsprechende Stubfunktion setzen if (!CheckNullPtr(TargetLib->SafeDiv)) { TargetLib->SafeDiv = SafeDivStub; TargetLib->FunctionsAreLoaded = false; } if (TargetLib->FunctionsAreLoaded) { return(ERR_SUCCESS); } else { return(ERR_ONE_OR_MORE_PROCS_NOT_FOUND); } } TargetLib->FunctionsAreLoaded = false; return(ERR_LIB_NOT_FOUND); } return(ERR_FAILURE); } internal void Win32_UnloadLib(win32_lib *TargetLib) { //Wenn eine Dll geladen ist, dann... if (TargetLib->LibIsLoaded) { //Funktionszeiger auf entsprechende Stubfunktion setzen, und Dll entladen TargetLib->SafeDiv = SafeDivStub; TargetLib->FunctionsAreLoaded = false; TargetLib->LibIsLoaded = false; TargetLib(TargetLib->LibHandle); } }
-
Wir werden ganz bestimmt nicht anfangen, deinen Windows-spezifischen Code hier zu debuggen, vor allem, weil der Code kein kompilierbares Programm ergibt - aber auch, weil das eine ganz hervorragende Übung im Debuggen ist.
Ach, und
LibIsLoaded
ist überflüssig. NimmNULL
oderINVALID_HANDLE_VALUE
für dein Handle, um anzugeben, ob dieses geladen wurde oder nicht.
-
lulle2007200 schrieb:
Ich habe ein Programm, in dem ich eine von mir erstellte DLL mit einigen mathematischen Funktionen lade (mit LoadLibrary).
Hör auf mit deinem WinAPI-Geraffel dieses Subforum zuzumüllen.
-
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.