Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi PlugIns mal wieder (https://www.delphipraxis.net/153542-plugins-mal-wieder.html)

CHMedia 7. Aug 2010 12:24

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:
  • Beim Programmstart wird in einem vorgegebenen Verzeichnis nach PlugIns gesucht -- Erledigt
  • Jedes gefundenes PlugIn (*.dll) wird aufgerufen und nach dem unterstützten Dateiformat gefragt
    (Das PlugIn müsste also einen String zurückgeben, wie z. B. *.txt)
  • Wenn nun eine Datei in der Host-Applikation geöffnet wird, wird der Dateiname an das PlugIn übergeben.
  • Das PlugIn übergibt dann die Daten (z. B. als String) an die Host-Applikation.

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

gsh 7. Aug 2010 12:49

AW: PlugIns mal wieder
 
http://www.delphipraxis.net/497604-post.html

oder

Hier im Forum suchenPlugins

igel457 7. Aug 2010 16:25

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:
//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
Delphi-Quellcode:
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


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