heyho, also ich hab mich jetzt auch mal an ein Pluginsystem gesetzt...im Grunde ist das ne Mischung aus dem Tutorial von sakura und deiner Idee (denk ich zumindest oO ^^) also es ist auf jedenfall nichts besonderes denk ich...
es gibt eine Klasse TPlugin, von dem man seine Plugins ableiten kann...jedes Plugin enthält den Befehl Execute dem man dann die Parameter übergeben kann...dann gibts noch die Callbackprozedur Send, mit der dann Werte zurückgegeben werden können...sprich ich übergeb z.B. einem Downloadplugin den Befehl CMD_DOWNLOAD (einfach Konstanten) und dazu dann die Parameter als array of string, und in der
DLL wird der Command ausgewertet, verarbeitet, und mit Send werden dann wieder Daten zurückgegeben, z.B. die Fortschrittsanzeige...in der Anwendung sieht dass dann z.B. so aus
Delphi-Quellcode:
uses {...} PluginDefinition;
var plugin1: TPlugin;
procedure RecieveProc(cmd: integer; parameter: array of string);
begin
case cmd of
// hier werden dann die commands ausgewertet
CMD_SHOWMESSAGE: showmessage(parameter[0]);
end;
end;
{...}
procedure TForm1.FormCreate(Sender: TObject);
var
name: string;
begin
plugin1 := TPlugin.Create;
loadplugin('plugins/plugin.dll', plugin1);
plugin1.Send := RecieveProc;
plugin1.Execute(CMD_GET_NAME,['']); // nur ein Beispiel ;-)
end;
Die PluginDefinition.pas enthält alle Klassen und die FUnktion zum Laden des Plugins, sprich man braucht außer dieser
Unit und der RecieveProc Prozedur nichts...in der
DLL nimmt man ebenfalls die plugindefinition.pas, und erstellt sich eine Klasse...z.B.
Delphi-Quellcode:
{...}
TPlugin01 = class(TPlugin)
public
constructor Create(aParent: THandle); overload;
function GetName: string; override; stdcall;
function GetAuthor: string; override; stdcall;
function GetComment: string; override; stdcall;
procedure Execute(cmd: integer; parameter: string); override; stdcall;
end;
constructor TPLugin01.Create(aParent: Cardinal);
begin
inherited Create;
Parent := aParent;
end;
function TPlugin01.GetName: string;
begin
result := 'Testplugin';
//showmessage('Testplugin');
end;
function TPlugin01.GetAuthor;
begin
result := 'LH_Freak';
end;
function TPlugin01.GetComment;
begin
result := 'Nur ein Test';
end;
procedure TPlugin01.Execute(cmd: Integer; parameter: string);
begin
case cmd of
CMD_GET_NAME: send(CMD_SHOWMESSAGE, ['Testplugin']);
end;
end;
function LoadPlugin(Parent: THandle; var PlugIn: TPlugIn): Boolean; export;
begin
try
PlugIn := TPlugIn01.Create(Parent);
Result := True;
except
Result := False;
end;
end;
exports
LoadPlugin name 'LoadPlugin';
begin
//MessageBeep(0);
end.
Das mag jetzt zwar nicht soooo besonders anspruchsvoll und schwierig sein, und über Interfaces könnte man denk ich mal da schon bessere Sachen machen, aber es erfüllt seinen Zweck Prima...man definiert sich einfach seine Konstanten, und kann sich damit dann doch auch eine ganz flexible
API erstellen...
Bei Bedarf kann ich die PluginDefinition.pas ja mal hier veröffentlichen
Gruß
Flo
P.S.: Ich werde das ganze demnächst in den MUH Messenger einbauen, da mich das schon irgendwie reizt auszuprobieren was damit alles geht, und das eignet sich ja mal wohl perfekt