![]() |
Re: Flexibles Pluginsystem: Diskussion
so ich hab nochmal wegen dem Observer nachgedacht und mir ist dann ein super konzept eingefallen :mrgreen:
hab heut den ganzen Tag an diesem System programmiert. Nun ist es ein Flexibles Observer Pluginsystem :cheers: Die Flexiblität des Pluginsystems ist erhalten geblieben. Nur muss das Plugin beim starten der Anwendung bei meinem Observer anmelden. Sobald einmal angemeldet wird das Plugin bei diesem Ereignis benachrichtigt und kann sofort darauf reagieren. *auf Uhr schau* (1:20 Uhr) Ich bin jetzt aber viel zu müde um ein Tutorial darüber zu schreiben, denn das ganze ist hoch komplex und wird wahrscheinlich nicht leicht zum erklären sein. Vielleicht komm ich morgen oder übermorgen dazu. |
Re: Flexibles Pluginsystem: Diskussion
Kann man eigentlich auch Plugins in einer anderen Sprache programmieren?
Also das das Programm in Delphi ist, das Plugin aber beispielsweise C++ oder so? Ich weis dass es Records nur unter Delphi gibt(oder? :gruebel: ) Aber wenn man etwas anderes verwendet was andere Sprachen auch können müsste es doch gehen oder? |
Re: Flexibles Pluginsystem: Diskussion
sicher kann man das
und man kann auch records benutzen weil records ist ja nichts delphi spezielles (außer der name) sonderen nur eine datenttyp wo mehere variablen nacheinander reingestopft werden. In C++ und so gibt es des imho auch nur weiß ich gerade nicht wie es heißt |
Re: Flexibles Pluginsystem: Diskussion
... records gibt es auch in C, die heißen da nur structs. und sind je nach cmopiler eventuell anders aligned, weshalb man in delphi packed records verwenden sollte.
|
Re: Flexibles Pluginsystem: Diskussion
also wenn ich packed records verwende kann ih ohne größere Probleme die Plugins in anderen Sprachen schreiben?
Ihr sagt in C da heissen die Structs, C++, wo noch? Gibts da irgendwo Informationsquellen dafür? |
Re: Flexibles Pluginsystem: Diskussion
Mir ist gerade eingefallen des ich des selber mal in der DP gefragt hab:
![]() |
Re: Flexibles Pluginsystem: Diskussion
Wie sieht es denn aus mit dem Flexiblen Observer Pluginsystem Tutorial? Würde mich scon interessieren, da ich da im moment auch dran arbeite sowas zu machen. Wär cool, wenn du das noch mal machen könntest gsh...
|
Re: Flexibles Pluginsystem: Diskussion
hmm jojo wenn ich dazu zeit hätte, aber da ich zur zeit 3,5 Jobs habe bin ich ehrlich gesagt zu erschöpft um mich da dran zu setzen
aber mal schaun wollt mir jetzt eh mal wieder urlaub gönnen :mrgreen: |
Re: Flexibles Pluginsystem: Diskussion
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:
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.
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;
Delphi-Quellcode:
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...
{...}
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. 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 ;-) |
Re: Flexibles Pluginsystem: Diskussion
Für Plugins empfehlen sich Interfaces, gerade dann, wenn man auch Sprachenunabhängig arbeiten will (C, Delphi...)
Oder Packages, wenn man bei Delphi bleibt... Denn mit sowas da
Delphi-Quellcode:
in dlls, kommt man sehr sehr schnell ans Limit der flexibilität...
function LoadPlugin(Parent: THandle; var PlugIn: TPlugIn): Boolean; export;
begin try PlugIn := TPlugIn01.Create(Parent); Result := True; except Result := False; end; end; Bye Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 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