AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klassen über Modulgrenzen hinaus instanziieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen über Modulgrenzen hinaus instanziieren

Offene Frage von "DGL-luke"
Ein Thema von DGL-luke · begonnen am 17. Okt 2006 · letzter Beitrag vom 24. Okt 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

Klassen über Modulgrenzen hinaus instanziieren

  Alt 17. Okt 2006, 15:22
Hallo,

ich bin immer noch in den Weiten der DLL-Hölle unterwegs (und auf dem besten wege, sie mit einem kleinen team um einige schöne exemplare zu erweitern) und möchte für eine Art Plugin-System gerne in einer Dll eine Klasse deklarieren. Diese DLL wird dann aus einer anderen DLL (die wird von einem generischen Loader geladen, man kann sie also getrost als nicht die komplexität erhöhendes hauptmodul betrachten) dynamisch geladen und eine per Funktion aus der DLL gelieferte Klasse wird dann instanziiert. Ich werde das anhand eines kleinen code-beispiels erläutern:

Delphi-Quellcode:
//Deklaration
library Plugin1;

initialization

uses BaseClassUnit;

type
  TInherited = class(TBase)
    ...
  end;

function RetrieveClass: TBaseClass; export;

implementation

function RetrieveClass:TBaseClass;
begin
  Result := TInherited;
end;
Delphi-Quellcode:
uses BaseClassUnit;

//Benutzung
procedure CreatePlugin;
var ModuleRetrieveClass: function: TBaseClass; //salopp formuliert ;)
begin
//Modul laden, ModuleRetrieveClass-Prozedur zuweisen
...
//Klasse erstellen
NewPlugin := ModuleRetrieveClass.Create;
end;
Geht das? Geht das, aber ganz anders? Hilft mir da Delphi mit seinen Persistenzsachen (RegisterClass etc.)?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 14:09
*push*
Niemand ein Statement für mich?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 14:11
Wenn dir Delphi helfen soll, müsstest du imho Packages (Bpls) statt Dlls nehmen.
Markus Kinzler
  Mit Zitat antworten Zitat
bepe

Registriert seit: 17. Okt 2006
118 Beiträge
 
#4

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 17:28
Das kann ich mir kaum vorstellen. Über BPL's vielleicht (oder sogar wahrscheinlich). Die Struktur bzw. Deklaration wird deinem Programm schon bekannt sein müssen.

Je, nachdem wie deine Anforderungen sind könntest du eine Plugin-Klasse in deinem Programm deklarieren, welche eigentlich gar nichts macht. Nur damit die Eigenschaften und Methoden bekannt sind. Dann könntest du diese Klasse in DLL's übernehmen und dort immer mit identischen Methoden aber unterschiedlicher Funtkionalität implementieren. Die Instanz würde dann in der DLL erzeugt und an dein Programm übergeben.

Wobei ich mir da nicht sicher wäre, dass es nicht zu unerwünschten Nebenwirkungen kommt.

mfg,
bp
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 18:22
Wenn sowohl deine Anwendung, als auch die DLL die genaue Struktur der Klasse kennen, quasi die Klasse in beiden definiert ist, dann kannst du sie wie einen "normalen" Datentypen als Ergebnis zurückliefern.

Es funktioniert, ob es Nebenwirkungen hat, kann ich dir nicht sagen
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.884 Beiträge
 
Delphi 12 Athens
 
#6

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 19:36
DLL Funktionen können zwar Objekte übergeben und empfagen, aber die Klassen müssen
auf beiden Seiten bekannt sein. Sie sind dann nur eingeschränkt ausserhalb des Moduls nutzbar,
weil die sogenanten RTTI im andere Modul nicht die selben sind. RTTI sind für alle von TPersistent
erbenden Objekte wichtig.

Der "IS" Operator arbeitet mit den RTTI , vor allem in Tpersistent.assign(bla:TPersistent) wird er benutzt.

Wenn du aber ganz neue Klassen baust , also von TObject erbst, dann lohnt es sich alle zugriffe in Interfaces
zu definieren. Besser also von TInterfacedObject erben und eigene Interfaces implementieren.


Ansonsten must du wohl mit BPLs arbeiten.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 19:37
Hallo,

wenn Du ein sauberes System brauchst und auf BPLs verzichten willst, dann kann ich Dir Interfaces empfehlen. Du definierst ein einInterface. und die DLL liefert Dir eine Instanz, die dieses erfüllt. Schon kannst Du im Hauptprogramm damit arbeiten, ohne dass Du wissen musst, wie das Ding intern aussieht. Ist vielleicht etwas aufwendiger zu implementieren, aber ich finde, das lohnt sich.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 22:13
Interfaces sind natürlich eine Möglichkeit. Dass mir das nicht von Anfang an klar war

@xaromz: Dein post impliziert, mit BPLs gehts?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 20. Okt 2006, 23:39
Hallo,
Zitat von DGL-luke:
Interfaces sind natürlich eine Möglichkeit. Dass mir das nicht von Anfang an klar war
Besser spät als nie .
Zitat von DGL-luke:
@xaromz: Dein post impliziert, mit BPLs gehts?
Wenn Du Deine Basisklasse in einem Package definierst und dann dieses sowohl im Hauptprogramm als auch in der DLL verwendest, benutzt Du ja in beiden Modulen die selbe RTTI. Dazu musst Du aber IMHO auch die RTL als Package verwenden, sonst fehlt Dir die Basis (TObject und so).

Ich muss aber dazusagen, dass ich nie viel mit mit Runtime-Packages gemacht habe. Als ich das gleiche Problem hatte, habe ich meinen gesamten Quellcode umgekrempelt und auf Interfaces umgestellt. Waren ja nur ~120 Klassen in 150.000 Zeilen . Seitdem ist das Leben aber viel einfacher. Ich finde auch die Interface-Deklaration für den Überblick über eine Klasse schön übersichtlich, da nur die öffentlichen Methoden drin stehen.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Klassen über Modulgrenzen hinaus instanziieren

  Alt 21. Okt 2006, 10:23
Hmm... ich denke, ich müsste da noch mehr umkrempeln^^

Unter anderem benutze ich die RTTI um Objekte zu serialisieren... und um das hinzukriegen, hab ich ewig gebraucht
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz