Wiederverwendbaren Code geschickt auslagern



  • Moin zusammen,

    ich habe mehrere Klassen, die ich in einigen Projekten einsetze. Bis dato habe ich die immer in eine statische Lib verpackt und dem Projekt hinzu gelinkt.

    Eigentlich beabsichtige ich immer, nur eine exe weiter zu geben, um Aghängigkeiten und die dll-Problematik zu umgehen. Und Speicher kostet ja heute nun auch nicht mehr die Welt. 😉

    Ich bekam aber jetzt die Anfrage von jemand, bei dem ich mehrere Projekte am laufen habe, eventuell gemeinsam Code auszulagern. Ok, ich denke, ich kann ihn nochmals davon abbringen, aber nun suche ich eine Lösung für die Zukunft.

    Dabei habe ich eventuell zwei Möglichkeiten:

    • Packages benutzen (nur Laufzeit, keine Designpackages)
    • DLLs erstellen

    Zu Packages: Wenn ich meine Libs in Packages umwandle, dann müsste ich sie doch weiterhin auch statisch binden können, dass heißt, ich hab die Wahl, ob ich statisch oder dynamisch mit allen Packages das Programm ausliefere. Liege ich da richtig? 😕

    Zu DLLs: Ich verwende auch Klassen der VCL, die sollen in DLLs ja etwas ärger machen, ich hab da aber noch keine Erfahrung mit gesammelt.

    Welchen Weg würdet Ihr einschlagen? Packages, DLLs oder bei der statischen Lib bleiben?

    VG Pixfreak

    PS: Nutze RAD-Studio 2010



  • Also ich nutze DLLs mit VCL-Klassen problemlos. Ich gebe meine EXE mit den DLLs weiter. Die DLLs rufe ich immer zur Luafzeit, wenn ich sie brauche.
    Bisher klappt alles wunderbar.



  • Moin,

    ich möchte die DLLs aber automatisch mit laden, also kein manuelles Laden im Programm...

    VG Pixfreak



  • Hallo

    Dann verwende doch statische DLLs. Die brauchst du sowieso wenn du nicht nur ein reines C-Interface haben willst, sondern im Interface auch C++ Möglichkeiten wie Klassen nutzen willst.

    bis bald
    akari



  • pixfreak schrieb:

    Zu Packages: Wenn ich meine Libs in Packages umwandle, dann müsste ich sie doch weiterhin auch statisch binden können, dass heißt, ich hab die Wahl, ob ich statisch oder dynamisch mit allen Packages das Programm ausliefere. Liege ich da richtig? 😕

    Ja.

    pixfreak schrieb:

    Zu DLLs: Ich verwende auch Klassen der VCL, die sollen in DLLs ja etwas ärger machen

    Nein, aber es gibt da einen Umstand zu beachten: wenn du zwischen einer DLL und einer Anwendung "verwaltete Datentypen" (C++-Klassen wie std::string, std::vector etc., ebenso DynamicArray<>, AnsiString oder UnicodeString aus der Delphi-RTL) austauschst, müssen sie zumindest einen gemeinsamen Memory-Manager verwenden (borlndmm.dll; weitere Erklärungen liefert der Kommentar, der in jedem neuen DLL-Projekt automatisch in die Quelldatei eingefügt wird). Wenn du aber Delphi-Klassen austauschst - also irgendetwas, was von TObject erbt -, müssen sowohl DLL als auch Anwendung mit Laufzeit-Packages (also rtl*.bpl, vcl*.bpl, ...) gelinkt werden.

    pixfreak schrieb:

    Welchen Weg würdet Ihr einschlagen? Packages, DLLs oder bei der statischen Lib bleiben?

    Im Grunde sind Packages dafür ideal. Daß mehrere Anwendungen dasselbe Package benutzen, setzt allerdings voraus, daß alle mit derselben Version von VCL und RTL (d.h., mit C++Builder oder Delphi 2010) erstellt wurden.

    Wenn du das nicht gewährleisten kannst, kannst du immer noch Packages verwenden; dann mußt du sie eben jeweils mit unterschiedlichen Compilern übersetzen. Es wäre dann ganz sinnvoll, den Packages analog zu den VCL- und RTL-Packages ein Versionssuffix mitzugeben, sonst gerätst du schnell in die "DLL-Hell".



  • Hi audacia,

    genau das meinte ich mit Problemen der VCL und DLLs. In der Tat, da sind Objekte abgeleitet von TObject mit dabei...

    Also ich denke, der gangbare Weg für mich ist über die Package Schiene. Ich kann es erst einmal alles statisch machen, und wenn einer unbedingt Dynamik will, bin ich nicht in der Sackgasse... 😉

    Viele Grüße und Danke für die Infos

    Pixfreak


Log in to reply