Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Klassenableitung in DLL auslagern? (https://www.delphipraxis.net/138076-klassenableitung-dll-auslagern.html)

moelski 3. Aug 2009 10:37


Klassenableitung in DLL auslagern?
 
Moin !

Wir haben in unserer Software eine Klasse. Vereinfacht schaut die so aus:
Delphi-Quellcode:
type TLVDevice = class(TPersistent)
  public
    DeviceID:           TLVDeviceID; // ID des Gerätes
    Name :              ShortString; // Name des Gerätes

    constructor Create(Owner: TObject);
    procedure  Free; virtual;
    procedure  InitValues(Kanal: TLVKanal); virtual;

    function   GetMaxKanal: TLVKanal; virtual;
  published
  protected
end;
Dann haben wir Units in denen ebenfalls eine Klasse definiert wird, welche die Klasse TLVDevice erbt:
Delphi-Quellcode:
type
  TLVTEST = class(TLVDevice)
    public
      constructor Create(Owner: TObject);
     
      function GetMaxKanal: TLVKanal; override;
    private

    end;
Ist alles stark verkürzt, aber es geht eh nur ums Prinzip.

Im Programm selber wird dann irgendwann eine Instanz der Klasse erzeugt mittels:
Delphi-Quellcode:
PresentDevice := TLVTEST.Create(MainForm);
Wäre es nun möglich, dass man die Klasse TLVTEST in eine DLL auslagern würde?
Was wäre dabei alles zu beachten, wenn es denn geht?

Luckie 3. Aug 2009 10:42

Re: Klassenableitung in DLL auslagern?
 
Klassen und DLLs sind nicht unbedingt Konzepte, die gut zusammenpassen. Da DLL und Anwendung unterschiedliche Speichermanager benutzen, ist ein Objekt, welches in der DLL erzeugt wurde nicht gleich dem Objekt, welches in der Anwenung dann benutzt wird oder benutzt werden soll. Eine Ausnahme stellt das COM/ActiveX Konzept dar. allerdings wird hie rmit Interfaces gearbeitet.

Auch hier stellt sich mir erstmal wieder die Frage: Warum? Warum eine DLL?

moelski 3. Aug 2009 10:48

Re: Klassenableitung in DLL auslagern?
 
Moin !

Zitat:

Warum eine DLL?
Es sind im Laufe der Zeit einige Units zusammen gekommen. Und die würden wir in Zukunft gerne aus dem Programm auslagern.

Bernhard Geyer 3. Aug 2009 10:54

Re: Klassenableitung in DLL auslagern?
 
Wenn du das machst musst du auf jedenfall gemeinsamme Runtimepackages (BPL's) verwenden.
Ansonsten gibt es immer Probleme. Hatten erst den Fall das eine solche Einbindung (Objekt aus DLL ohne Runtimepackages) an einer komplett andere Stelle gekracht hat. Fehlersuche ist natürlich damit sehr schwer.

Luckie 3. Aug 2009 10:59

Re: Klassenableitung in DLL auslagern?
 
Zitat:

Zitat von moelski
Es sind im Laufe der Zeit einige Units zusammen gekommen. Und die würden wir in Zukunft gerne aus dem Programm auslagern.

Und warum? Du handelst dir damit mehr Probleme und Arbeit ein, als dass es dir Vorteile bringt. Ginge es um einfache Funktionen könnte ich das nioch verstehen, aber gerade Klassen in DLLs verkomplizieren das ganze doch erheblich.

moelski 3. Aug 2009 11:04

Re: Klassenableitung in DLL auslagern?
 
Moin !

Ok, dann währe wohl folgendes sinnvoller ....

In der Anwendung eine abgeleitete Klasse von TLVDevice erstellen. In den Methoden werden dann aber einzelne Funktionen / Proceduren einer DLL verwendet.
Also dann in etwa so:
Delphi-Quellcode:
function TLVTEST.GetMaxKanal: Integer;
begin
  GetMaxKanal := DLL_GetMaxKanal;
end;
Damit hätten wir eine allgemein gültige Geräteklasse und je nach Gerät werden da Methoden aus einer Geräte DLL gemappt.

himitsu 3. Aug 2009 11:42

Re: Klassenableitung in DLL auslagern?
 
das würde noch gehn
Delphi-Quellcode:
function TLVTEST.GetMaxKanal: Integer;
begin
  GetMaxKanal := DLL_GetMaxKanal;
end;
oder nimm lieber gleich Interfaces


ich hab zwar auch schon eine Klasse in EXE/DLL verteilt, aber da stecken Monate an Arbeit drin und selbt jetzt weiß ich nichtmal, ob wirklich alles geht.
> in der einen DLL-Version von himXML verbaut

aber dafür waren Umleitungen des Speichermanagers (ist recht leicht und unter Anderem als ShareMem bekannt) und vorallem ein Verbiegen der RTTI nötig (welches nicht grad tivial ist)

das sind noch die harmlosesten Probleme, welche sich mir in diesem Zusammenhang stellten
http://www.delphipraxis.net/internal...791&highlight=
http://www.delphipraxis.net/internal...601&highlight=
und welche ich grad mal schnell fand

Bernhard Geyer 3. Aug 2009 12:58

Re: Klassenableitung in DLL auslagern?
 
Zitat:

Zitat von moelski
Damit hätten wir eine allgemein gültige Geräteklasse und je nach Gerät werden da Methoden aus einer Geräte DLL gemappt.

Und dann ergänzt du in der Exe ein Methode an der falschen stelle und vergisst die DLL neu zu kompilieren und es kracht beim Zugriff. Willst du wirklich eine DLL-Hölle in dein Programm einbauen?

moelski 3. Aug 2009 13:15

Re: Klassenableitung in DLL auslagern?
 
Moin !

Zitat:

Und dann ergänzt du in der Exe ein Methode an der falschen stelle
Also das was in den Units passiert ist besteht jetzt in der Form schon eine geraume Zeit. Das sich da was grundlegendes ändert ist eher unwahrscheinlich.

In den Units geht es im Grunde nur um das Zerlegen eines Strings in seine Bestandteile und deren Auswertung.
Wir haben dafür eine Struktur die sich jetzt wie gesagt schon lange bewährt hat.

Zitat:

Willst du wirklich eine DLL-Hölle in dein Programm einbauen
Mal abwarten. Damit das alles funktioniert müssen eh erst noch die Units vereinfacht werden. Dort stehen direkte Zugriffe auf Komponenten drin. Erst wenn das alles sauber (entfernt) ist werden wir eine Umstellung testen.

hanspeter 3. Aug 2009 13:26

Re: Klassenableitung in DLL auslagern?
 
Zitat:

Zitat von moelski
Zitat:

Willst du wirklich eine DLL-Hölle in dein Programm einbauen
Mal abwarten. Damit das alles funktioniert müssen eh erst noch die Units vereinfacht werden. Dort stehen direkte Zugriffe auf Komponenten drin. Erst wenn das alles sauber (entfernt) ist werden wir eine Umstellung testen.


Um in Delphi vernünftig zu modularisieren kommt man, glaube ich, an der Com - Technologie nicht vorbei.
Ein Com Object ist in sich gekapselt und braucht keine Laufzeit - Bpl.
Hier ist sogar das möglich, was in Delphi selbst absolut unmöglich ist , z.B. aus D2009 ein
in D7 entwickeltes Modul verwenden.
Einen weiteren Vorzeil hat die Com- Technologie. Ich bekomme Net und Delphi in beiden Richtungen zueinander.
In D2009 ist das Handling etwas verbessert worden.
Von DLL und erst recht BPL würde ich bei der Modularisierung die Pfinger lassen. Wir sind damit gehörig auf die Nase
gefallen, da jede BPL gegen die gleiche Compilerversion compiliert sein muss.
(Z.B. Drittkomponenten ohne Versionsnummer im BPL-Namen )

Gruß
Peter

Bernhard Geyer 3. Aug 2009 13:26

Re: Klassenableitung in DLL auslagern?
 
Zitat:

Zitat von moelski
Also das was in den Units passiert ist besteht jetzt in der Form schon eine geraume Zeit. Das sich da was grundlegendes ändert ist eher unwahrscheinlich.

Nach Murphy ist das das erste was nach umstellung auf DLL geändert wird.

Zitat:

Zitat von moelski
In den Units geht es im Grunde nur um das Zerlegen eines Strings in seine Bestandteile und deren Auswertung.

Wenns nur um strings geht würde ich eine C-Kompatible Schnittstelle mit PAnsi/Widechar als übergabeparameter anstreben. Dann noch eine Delphi-Wrapper rum und du kannst auch Schnittstellenänderungen(erweiterungen) gelassen entgegen sehen.

moelski 3. Aug 2009 13:34

Re: Klassenableitung in DLL auslagern?
 
Moin !

Zitat:

Wenns nur um strings geht würde ich eine C-Kompatible Schnittstelle mit PAnsi/Widechar als übergabeparameter anstreben. Dann noch eine Delphi-Wrapper rum und du kannst auch Schnittstellenänderungen(erweiterungen) gelassen entgegen sehen.
So ist es :-)

mirage228 3. Aug 2009 13:36

Re: Klassenableitung in DLL auslagern?
 
Ich würde da gerne noch den COM Typen "BSTR" bzw. "WideString" in Delphi in den Raum werden ;). Damit lässt sich quasi so bequem wie mit "normalen" Strings in Delphi arbeiten und sie sollten auch von C++ unterstützt werden.

Viele Grüße

himitsu 3. Aug 2009 13:39

Re: Klassenableitung in DLL auslagern?
 
Zitat:

Zitat von Bernhard Geyer
Wenns nur um strings geht würde ich eine C-Kompatible Schnittstelle mit PAnsi/Widechar als übergabeparameter anstreben. Dann noch eine Delphi-Wrapper rum und du kannst auch Schnittstellenänderungen(erweiterungen) gelassen entgegen sehen.

oder halt den WideString, welcher den Unicode-String der ole32.dll kapselt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz