Zugriffsverletzung, dynamisches Laden einer dll



  • Hallo,

    evtl. ist es ein Verständnis Problem von meiner Seite.
    Kann mir einer sagen warum das hier nicht funktioniert:

    CPlugin* MyPlugin;
        if (!CreatePlugin(MyPlugin)) ShowMessage("Fehler");
    
        MyPlugin->Execute(); // hier kommt eine Zugriffsverletzung
    
    bool __fastcall TForm1::CreatePlugin(CPlugin* MyPlugin)
    {
        typedef CPlugin* TCreatePluginObject(void);
        TCreatePluginObject* CreatePlugInObject;
    
        AnsiString PluginName = "loop_plugins\\TestLoop.dll";
    
        HINSTANCE h = LoadLibrary(PluginName.c_str()); //DLL laden.
    
        if (h != 0) {
            CreatePlugInObject = (TCreatePluginObject*)GetProcAddress(h, "@CreatePlugInObject$qv");
        } else {
            ShowMessage("DLL Not found");
            return false;
        }
        if (CreatePlugInObject != NULL) {
            MyPlugin = CreatePlugInObject();
        } else {
            ShowMessage("Objekt not created");
            return false;
        }
    
        // DLL ist nun geladen und kann ausgeführt werden.
    
        // hier funktioniert es:
        MyPlugin->Execute();
        return true;
    }
    

    wenn ich das Objekt in einer Routine erzeuge und dort auch aufrufe klappt es.
    Wenn ich jedoch den Zeiger zurückgebe und dort aufrufe bekomm ich eine
    Zugriffsverletzung.

    Wird das dynamische Objekt beim Verlassen der Routine gelöscht? Wie kann ich das
    verhindern?



  • wie sieht denn CreateLoopPlugin aus ?



  • CreateLoopPlugin = CreatePlugin das hab ich versehentlich falsch gepostet, sorry.



  • Die Variablen MyPlugin im Hauptprogramm und in der Methode CreatePlugin sind nicht dieselben. MyPlugin ist innerhalb der Methode eine lokale Variable, d.h. was du mit dieser Variablen dort machst, hat keine Auswirkungen auf dein Hauptprogramm. Somit geht auch die Zuweisung der Instanz durch MyPlugin = CreatePlugInObject() nach dem Methodenende verloren.
    Du must also sicherstellen, dass du die Adresse der Instanz der Variablen des Hauptprogramms zuweist. Mir fallen da folgende Versionen ein:
    1. Gib die Adresse als Rückgabewert der Methode zurück und weise es dort der Variablen MyPlugin des Hauptprogramms zu.
    2. Übergib die Variable MyPlugin als Referenz, d.h. CPlugin* &MyPlugin.
    3. Übergib einen Zeiger auf die Zielvariable MyPlugin, d.h.CPlugin** MyPlugin



  • vielen Dank! So klappt es 🙂 🙂


Anmelden zum Antworten