![]() |
PlugIns mal wieder
Hallo,
ich habe ein wenig Vorkenntnisse was die Programmierung mit Delphi betrifft. Allerdings habe ich vorher noch nie PlugIns programmiert. Ich probiere zur Zeit eine Applikation zu erstellen, die diverse Dateiformate öffnen kann und Daten aus den Dateien extrahieren soll. Diese Daten sollen später in der Applikation dann angezeigt werden. Um das updaten zu vereinfachen und den Code übersichtlicher zu gestalten möchte ich nun eine Host-Applikation erstellen und für jeden unterstützen Dateityp ein PlugIn erstellen. Ich habe mir das folgendermaßen vorgestellt:
Nun würde ich gerne wissen, wie ich Daten (Strings, Integer, Boolean) zwischen der Host-Applikation und dem PlugIn austauschen kann. Später soll es z. B. auch möglich sein, dass ich eine Funktion in der Host-Applikation habe, die auf das Internet zugreift. Das PlugIn soll dann eine URL an die Host-Applikation senden und erhält den Inhalt der HTML-Seite zurück. Ich hoffe, dass ich es einigermaßen verständlich erklärt habe, was ich vorhabe und das jemand mir behilflich sein kann. Vielen Dank |
AW: PlugIns mal wieder
|
AW: PlugIns mal wieder
In meinem Pluginsystem, dass ich für Andorra 2D/Audorra geschrieben habe, definiere ich auf der Host-Seite eine abstrakte Klasse - zum Beispiel ("TImageLoader"). Diese definiert die Funktionen, die jeder "ImageLoader" bereitstellen muss - zum Beispiel "LoadImageFromFile".
In den Plugins implementiere ich die abstrakten Klassen und exportiere eine Funktion, die eine Instanz der Klasse zurückliefert. Du kannst in jeder Klasse für das Plugin (fast) alles machen, was du auch normalerweise in einer statisch gelinkten Klasse machen würdest. Du kannst nur nicht von der Host-Seite auf die RTTI der Klassen in der DLL zugreifen und mit dem Reservieren von Speicher, Strings und dynamischen Arrays musst du auch vorsichtig sein. Meine unten genannte Komplettlösung kümmert sich aber auch darum... Beispiel:
Delphi-Quellcode:
Etwas ausgereifter und Allgemeiner habe ich dieses Prinzip hier implementiert. In dieser Implementierung musst du dich nicht um das Exportieren von Funktionen kümmern, sondern einfach jede Plugin-Klasse in eine eigene Unit verfrachten und die Klasse im "Initialization"-Abschnitt der Unit mittels
//Host:
type TImageLoader = class public procedure GetFileExtensions(AStrs: TStrings);virtual;abstract; procedure LoadImageToMemory(AUrl: string; ATarMem: PByte);virtual;abstract; end; TImageLoaderConstructorFunction = function: TImageLoader; //Plugin type TPngImageLoader = class public procedure GetFileExtensions(AStrs: TStrings);override; procedure LoadImageToMemory(AUrl: string; ATarMem: PByte);override; end; procedure TPngImageLoader.GetFileExtensions(AStrs: TStrings);override; begin AStrs.Add('png'); AStrs.Add('mng'); end; procedure TPngImageLoader.LoadImageToMemory(AUrl: string; ATarMem: PByte);override; begin //Lade bild end; function CreateImageLoader: TImageLoader; begin result := TPngImageLoader.Create(); end; exports CreateImageLoader;
Delphi-Quellcode:
registrieren.
AcRegSrv.RegisterClass(TPngImageLoader, CreatePngImageLoader);
![]() Und ich habe sogar mal ein Demo-Video dafür gemacht: ![]() Die Dokumentation zu meinem Plugin-System gibt es hier: ![]() Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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