Thema: Delphi PlugIns mal wieder

Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#3

AW: PlugIns mal wieder

  Alt 7. Aug 2010, 17:25
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat