DLLs zu groß - geht es auch eleganter?



  • Hallo zusammen,

    in meinem Programm können verschiedene Dialoge göffnet werden, die beim Starten als DLL geladen werden.
    Der dynamische Zugriff auf die DLL´s ist mit typedef gelöst:

    typedef void (__stdcall *Funktionsname )();

    Ein wichtiger Punkt ist der Zugriff aus den Dialogen (also aus den DLL´s) auf die Hauptanwendung.
    Dazu übergebe ich beim Öffnen des Dialoges einen CWnd-Pointer auf das Hauptprogramm, um auf dessen
    Funktionen zuzugreifen. Das Ganze funktioniert soweit einwandfrei, doch ein paar Sachen sind mir noch unklar:

    Wenn ich einen DLL-Dialog (eigenständiges DLL-Projekt) kompiliere, müssen dort fast alle Dateien die vom Hauptprogramm
    verwendet werden, in den Projektordner aufgenommen werden. Dadurch sind die DLL´s entsprechend groß.
    Es scheint, als wenn die Codeabschnitte der Hauptanwendung, auf die von den Dialogen aus zugegriffen wird, nochmals
    in der DLL enthalten sind, denn immer wenn ich etwas am Hauptprogramm ändere, müssen danach alle DLL´s neu kompiliert werden,
    ansonsten haben die Änderungen keine Auswirkungen bzw. es kommt zu Abstürzen.
    Ist das normal, oder läßt sich dies auch eleganter lösen?

    Für alle sachdienliche Hinweise und Tips wäre ich sehr dankbar!

    MFG
    Andy

    Um das Problem etwas verständlicher zu machen, folgender Pseudocode zu Erläuterung:

    FunktionInHauptprogramm()
    {
      AfxMessageBox("Zustand 1");
    }
    
    FunktionInDll(...)
    {
      pParent->FunktionInHauptprogramm()
    }
    

    1.HAUPTPROGRAMM WIRD KOMPILIERT
    2.DLL-DIALOG WIRD KOMPILIERT
    3.NACH START DER HAUPTANWENDUNG ERSCHEINT: Zustand 1

    1.NUN WIRD DAS HAUPTPROGRAMM GEÄNDERT..

    FunktionInHauptprogramm()
    {
      AfxMessageBox("Zustand 2");
    }
    

    ..UND NUR DAS HAUPTPROGRAMM ERNEUT KOMPILIERT

    2.BEIM STARTEN DER HAUPTANWENDUNG ERSCHEINT WIEDER: Zustand 1



  • So ist es. Du kannst aus der DLL Funktionen im Hauptprogramm nur aufrufen, wenn du sie als Pointer übergibst (bei virtuellen Funktionstabellen passiert das auch).



  • @Ringding
    Ok, dass es mit dem übergebenen Pointer funktioniert, habe ich gesehen.

    Gibt es keine weiteren Meinungen zu dem beschriebenen Phänomen?
    Das würde ja in der Praxis bedeuten, das zu einem Programm xyz die mitgelieferten Plugins nicht mehr in der Nachfolgeversion dieses Programmes verwendet werden können, nur weil in der Nachfolgeversion vielleicht unbedeutende Veränderungen z.B. Layout, Farben etc. geändert wurden???



  • Deswegen muss man sich eine zukunftssichere Plugin-Schnittstelle überlegen.



  • @Ringding
    Reicht es nicht, dass die Funktion im Hauptprogramm, auf die von der DLL aus zugegriffen wird, in der Nachfolgeversion wieder vorhanden ist (d.h. gleicher Funktionsrumpf) deren Implementierung aber variieren kann???
    Wie könnte dann eine zukunftssichere Schnittstelle für diesen konkreten Fall aussehen?


Anmelden zum Antworten