Mehrere Dll's laden ?



  • Hallo,

    ich hab ein Problem mit dem laden von mehreren Dll's. Wenn ich nur eine Dll
    lade funzt alles wunderbar, wenn ich dann aber eine zweite laden will
    sagt GetLastError "Unzulässiger Zugriff auf einen Speicherbereich".
    Wenn ich die erste Dll vor dem laden der zweiten Dll wieder entlade klappts.

    Hier mein Code:

    HMODULE hmDLL1, hmDLL2;
    
    hmDLL1 = LoadLibrary(TEXT("C:\\test1.dll");
    if(hmDLL1 == NULL) 
    {
        MessageBox(NULL,szValues[0],"Fehler beim laden der DLL",MB_OK); 
    }
    else 
    {
        MessageBox(NULL,szValues[0],"Dll erfolgreich geladen",MB_OK); 
    } 
    
    //FreeLibrary(hmDLL1);
    
    hmDLL2 = LoadLibrary(TEXT("C:\\test2.dll");
    if(hmDLL2 == NULL) 
    {
        MessageBox(NULL,szValues[1],"Fehler beim laden der DLL",MB_OK); 
    }
    else 
    {
        MessageBox(NULL,szValues[1],"Dll erfolgreich geladen",MB_OK); 
    }
    

    Irgendwie muss es doch gehen. Hoffe ihr könnt mir helfen

    Gruß
    yogle



  • zeig doch mal deinen orginal code denn dieser funktioniert, mal abgesehen von den syntaxfehlern 😉



  • Hallo,

    also wenn ich bei mir diesen Code laufen lasse erscheint das gleiche Problem.
    Ich programmiere mit Dev-C++.

    #include <windows.h>
    
    HMODULE hmDLL1, hmDLL2;
    
    int main()
    {
        hmDLL1 = LoadLibrary(TEXT("C:\\test1.dll"));
        if(hmDLL1 == NULL)
        {
            MessageBox(NULL,"DLL1","Fehler beim laden der DLL",MB_OK);
        }
        else
        {
            MessageBox(NULL,"DLL1","Dll erfolgreich geladen",MB_OK);
        }
    
        //FreeLibrary(hmDLL1);
    
        hmDLL2 = LoadLibrary(TEXT("C:\\test2.dll"));
        if(hmDLL2 == NULL)
        {
            MessageBox(NULL,"DLL2","Fehler beim laden der DLL",MB_OK);
        }
        else
        {
            MessageBox(NULL,"DLL2","Dll erfolgreich geladen",MB_OK);
        }
    
        return 0;
    }
    

    Gruß
    yogle



  • Vermutlich kann die eine DLL nur an ihrer vorgesehenen Adresse, beispielsweise 0x10000000, eingeblendet werden und hat keine Relokationstabelle. Wenn die andere Dll dann schon an besagte Adresse geladen wurde, kann diese Dll eben nicht mehr geladen werden. Die andere Dll hat eine Relokationstabelle und kann deshalb dynamisch auch an eine andere Stelle im Adressraum geladen werden, sofern ihre Wunschposition schon belegt sein sollte.

    Prof.Smart



  • der Code funktioniert bei mir auch (Digital Mars Compiler)



  • Hallo,

    danke erstmal für eure Antworten.
    Die DLL's sind von mir selber geschrieben!
    Hier mal der Code der zwei DLL's.

    Erste DLL:

    #include <windows.h>
    
    #define DLLEXPORT __declspec(dllexport)
    
    BOOL WINAPI DLLMain(HINSTANCE hDllInst, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason) 
        {
            case DLL_PROCESS_ATTACH:
                break;
            case DLL_PROCESS_DETACH:
                break;
            case DLL_THREAD_ATTACH:
                break;
            case DLL_THREAD_DETACH:
                break;
        }
        return TRUE;
    }
    
    DLLEXPORT void DllFunction1()
    {
        MessageBox(NULL,"Testmessage der Dll!","DLL Message", MB_SETFOREGROUND | MB_OK);    
    }
    

    Und der zweiten DLL:

    #include <windows.h>
    
    #define DLLEXPORT __declspec(dllexport)
    
    BOOL WINAPI DLLMain(HINSTANCE hDllInst, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason) 
        {
            case DLL_PROCESS_ATTACH:
                break;
            case DLL_PROCESS_DETACH:
                break;
            case DLL_THREAD_ATTACH:
                break;
            case DLL_THREAD_DETACH:
                break;
        }
        return TRUE;
    }
    
    DLLEXPORT void DllFunction2()
    {
        MessageBox(NULL,"Testmessage der zweiten Dll!","DLL Message", MB_SETFOREGROUND | MB_OK);    
    }
    

    Das sind nur Testdll's, von denen ich dann die Funktionen nutzen wollte.
    Den Code für die hab ich aus der FAQ.

    Gruß
    yogle


Anmelden zum Antworten