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:
//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;
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
AcRegSrv.RegisterClass(TPngImageLoader, CreatePngImageLoader);
registrieren.
http://andorracommons.svn.sourceforg...14&view=markup
Und ich habe sogar mal ein Demo-Video dafür gemacht:
http://www.vimeo.com/6577988
Die Dokumentation zu meinem Plugin-System gibt es hier:
http://andorracommons.sourceforge.ne...p=AcPersistent
Andreas