Projekt in DLL auslagern



  • moin moin

    ich habe folgendes problem: ich habe eine mittlerweile etwas grösseres projekt entwickelt und möchte nun bestimmte teile davon in DLL dateien auslagern. da ich in den DLL dateien jeweils gleich ganze klassen zur verfügung stelle deklariere ich diese wie folgt:

    __declspec(dllexport) ClassName{};
    

    soweit alles kein problem. sowohl die exe anwendung und sämtliche neuen DLL dateien lassen sich compilieren. aber und jetzt kommt es: wär hätte es gedacht, das linken bei den DLL dateien funktioniert nicht. in den klassen der DLL projekte, nutze ich unteranderem VCL komponenten wie die von Indy etc., welche unteranderem auch in der exe anwendung vorkommen, aber was vielmehr das problem ist: da ich header dateien in den DLL projekten verwenden muss, die von der exe anwendung stammen, fängt der salat erst an.

    jettz habe ich nähmlich in den DLL projekten das problem, dass der compiler denkt, ich benötige sämtliche objekte/symbole davon. und das ist eigentlich nur teilweise korrekt. ich benötige z.b. den haupt header von der anwendung, sagen wir Form1.h. ich muss über die DLL datei auch auf Form1::Attribute zugreiffen. aber sämtliches was von Form1.h selber eingebunden wird, benötige ich ja in der DLL datei nicht. ausserdem weiss ich noch nicht genau wie ich dem linker klar mache, dass Form1 in der exe anwendung vorkommt, und ich zur entwicklungs-zeit nur darauf verweise. eine extern deklaration würde wohl kaum was bringen, da Form1 nirgends vorkommen wird, ausser in der objekt datei Form1.obj. muss ich diese dem DLL projekt hinzufügen?

    und wie löse ich das hauptproblem ansich? was ich auch nicht verstehe ist, dass ich linker probleme mit unresolved external symbols kriege, bei eben z.b. Indy, obwohl ich sämtliche pfade zu header und libs angegeben habe. auch die pragma link direktive sind vorhanden, wenn nötig (Indy braucht garkeine). dynamische RTL linken ist aus und mit packages linken auch.

    ich bin ratlos.



  • Hallo

    DLLs sind abgeschlossene Einheiten. Da müßen auf Abhängigkeiten gut geachtet werden. Beispielsweise sollte zwar dein Programm von deiner DLL abhängen, aber deine DLL sollte nicht von deinem Programm abhängen! Du solltest dir also nochmal genau überlegen was du wo imlementieren willst. Und wie das Interface der DLL aussehen soll.

    Zum Problem Indy : Du must in der DLL das Indy-Package genauso einbinden wie du es im Hauptprogramm gemacht hast. Zum Beispiel reicht es nicht nur die Pfade anzugeben, auch der packagename muß dem Linker bekannt sein.

    Zum Problem Hauptform : Es ist natürlich nicht sinnvoll die Headerdatei aus dem Hauptprogramm in der DLL zu includen, das würde besagte Abhängigkeit verletzen. Da ich nicht weiß was genau du von deinem Form du in deiner DLL brauchst kann ich da nur einen allgemeinen Hinweis angeben : Du must deine DLL mit entsprechenden Parametern versehen. Sagen wir mal du hast in deinem Form eine Methode die eine Listbox fühlt :

    void __fastcall FormButtonClick(...)
    {
      ListBox1->Items->Add("Test");
    }
    

    dann kannst du diese so in die DLL exportieren :
    // Hauptprogramm

    void __fastcall FormButtonClick(...)
    {
      DllFunction(ListBox->Items);
    }
    // DLL
    
    void __declspec(dllexport) DLLFunction(TStrings* items)
    { 
      items->Add("Test");
    }
    

    Die DLL stellt Funktionen auf möglichst allgemeiner Art zur Verfügung, das Hauptprogramm nutzt diese. Nicht andersrum.

    bis bald
    akari



  • hast du recht. danke schön 🕶


Anmelden zum Antworten