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 bei

    struct 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. Nimm NULL oder INVALID_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.


Log in to reply