Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Flexibles Pluginsystem (https://www.delphipraxis.net/73567-flexibles-pluginsystem.html)

gsh 19. Jul 2006 22:55


Flexibles Pluginsystem
 
Hi

Ich hab mir mehrere Monate lang den Kopf darüber zerbrochen wie man am besten ein Pluginsystem realisiert.
Dann als ich am Rande der Verzweiflung war schaute ich wie in Trillian das Pluginsystem (das in meinen Augen sehr gut durchdacht ist) realisiert wurde. Dazu half mir dieser Link: http://www.trillian.cc/support/sdkmanual.php
Nach ein paar Tagen hatte ich mir durch Hilfe von der sdk mein eigenes Pluginsystem entwickelt das etwas abgekupfert ist. Aber ich habe keinen Code kopiert. Der gesamte Code ist von mir geschrieben worden. Außerdem nutze ich die SDK nur als Startidee die restlichen Überlegungen sind von mir :-D

So genug geredet nun zum System:
In diesem System braucht die PluginDLL nur eine procedure zum exportieren. Mit dieser procedure die nur zwei Parameter hat/braucht kann alles gesteuert bzw. auch leicht erweitert werden.

Also man nehme in der DLL eine procedure die so aufgebaut ist:
Delphi-Quellcode:
procedure PluginMain(Befehl : PChar; Parameter : Pointer); stdcall;
und dann schreibt man am besten eine eigene Unit die man Öffentlich verbreiten kann. In der werden die ganzen Records deklariert. Diese muss dann in der Anwendung und in der PluginDLL hinzugefügt werden.
z.b.:
Delphi-Quellcode:
type
  TPluginRecord_PluginInit = packed record
    PluginSend : procedure(Befehl : PChar; Parameter : Pointer);
    NochEinPChar : PChar;
    UndHaltwasManWillOderBraucht : Irgendwas;
  end;
so jetzt kann man in der Anwendung die PluginDLL laden und im Plugin die PluginMain Procedure aufrufen. Als Befehl z.b. 'PluginInit' und der Parameter ist das Record mit den Daten die das Plugin für diesen Befehl braucht:
Delphi-Quellcode:
var
  TempPluginRecord_PluginInit : TPluginRecord_PluginInit;
  PluginMain : procedure(Befehl : PChar; Parameter : Pointer);
begin
  {Plugin laden und PluginMain procedure zuweisen}
  TempPluginRecord_PluginInit.PluginSend := PluginSend; //procedure im Hauptprogramm im record speichern
  TempPluginRecord_PluginInit.NochEinPChar := 'blabla';
  PluginMain('PluginInit', @TempPluginRecord_PluginInit);
end;
Im Plugin:
Delphi-Quellcode:
procedure PluginMain(Befehl : PChar; Parameter : Pointer); stdcall;
begin
  if Befehl = 'PluginInit' then
  begin
    PluginSend := TPluginRecord_PluginInit(Parameter^).PluginSend; //Procedure Variable von Record zuweisen
    ShowMessage(TPluginRecord_PluginInit(Parameter^).NochEinPChar);
    PluginSend('Befehl an die Anwendung', nil); //z.b. ein zurück Befehl an die Anwendung
  end;
end;
Dann müsst ihr nur noch eure Anwendung mit PluginBefehlen zupflastern.
z.b. wenn irgendein Menu geöffnet wird:
Delphi-Quellcode:
PluginMain('MenuBlaBla open', nil);
natürlich könnt ihr auch eine Record übergeben aber wenn ihr keine weiteren daten übergeben müsst dann einfach nil schreiben.
Umso mehr ereignisse den Plugins mitgeteilt werden umso bessere plugins können geschrieben werden :???:


So ich hoff ich hab’s gut beschrieben :-D


Ich stelle diese Code frei zu Verfügung. Aber wenn jemand den Code verwendet kann er mich wenn er will gerne in seinen Programm erwähnen. :zwinker:


Eine Diskussion zu diesem System gibt es hier.

[edit=Chakotay1308]Diskussions-Link angefügt. Mfg, Chakotay1308[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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