![]() |
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: ![]() 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:
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.
procedure PluginMain(Befehl : PChar; Parameter : Pointer); stdcall;
z.b.:
Delphi-Quellcode:
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:
type
TPluginRecord_PluginInit = packed record PluginSend : procedure(Befehl : PChar; Parameter : Pointer); NochEinPChar : PChar; UndHaltwasManWillOderBraucht : Irgendwas; end;
Delphi-Quellcode:
Im Plugin:
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;
Delphi-Quellcode:
Dann müsst ihr nur noch eure Anwendung mit PluginBefehlen zupflastern.
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; z.b. wenn irgendein Menu geöffnet wird:
Delphi-Quellcode:
natürlich könnt ihr auch eine Record übergeben aber wenn ihr keine weiteren daten übergeben müsst dann einfach nil schreiben.
PluginMain('MenuBlaBla open', nil);
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 ![]() [edit=Chakotay1308]Diskussions-Link angefügt. Mfg, Chakotay1308[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 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