Thema: Delphi Flexibles Pluginsystem

Einzelnen Beitrag anzeigen

Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 

Flexibles Pluginsystem

  Alt 19. Jul 2006, 23:55
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

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:
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 = 'PluginInitthen
  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:
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


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.


Eine Diskussion zu diesem System gibt es hier.

[edit=Chakotay1308]Diskussions-Link angefügt. Mfg, Chakotay1308[/edit]
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat