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