Einzelnen Beitrag anzeigen

Benutzerbild von LH_Freak
LH_Freak

Registriert seit: 2. Mär 2005
Ort: Nürnberg
222 Beiträge
 
#29

Re: Flexibles Pluginsystem: Diskussion

  Alt 5. Nov 2007, 17:50
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
  Mit Zitat antworten Zitat