Re: Flexibles Pluginsystem: Diskussion
Nein das Flexible Pluginsystem von mir beruht NICHT auf dem Tutorial von sakura (ich kannte des zu dem zeitpunkt noch nicht mal)
und du hast mehr von sakura reinkopiert kommt mir vor denn in meinem TUT ist keine einzige Klasse und der Parameter ist auch ein ganz ein anderer |
Re: Flexibles Pluginsystem: Diskussion
Zitat:
Zitat:
|
Re: Flexibles Pluginsystem: Diskussion
Problem dabei, die RTTI steht dir dabei nur bedingt zur Seite...
Was zu sehr vielen kleinen Problemen und AHA-Effekten führen wird. Interfaces an sich sind gar nicht mal so schwer wie sie aussehen, zudem legen sie die Grundlage für schöne Erweiterungen, z.B. Com-Schnittstellen ec... Bye Christian |
Re: Flexibles Pluginsystem: Diskussion
Delphi-Quellcode:
Hey Leute, kann mir jemand diesen teil erklären? mit "PluginSend;"?
var
TempPluginRecord_PluginInit : TPluginRecord_PluginInit; PluginMain : procedure(Befehl : PChar; Parameter : Pointer); begin {Plugin laden und PluginMain procedure zuweisen} TempPluginRecord_PluginInit.PluginSend := PluginSend; //PluginSend? TempPluginRecord_PluginInit.NochEinPChar := 'blabla'; PluginMain('PluginInit', @TempPluginRecord_PluginInit); end; 1.klappt das bei mir nicht, ist ja auch nicht verwunderlich da ich das nicht deklariert habe, und 2. ich kopiere nicht gerne source wo ich nicht alles verstehe.. |
Re: Flexibles Pluginsystem: Diskussion
ich hab da mal ne frage. oben wurde gasagt es empfiehlt sich interfaces zu verwenden. aber warum soll man dies tun, ich mein was hat das für nen vorteil oder warum stößt man dabei an die grenzen der flexibilität?
|
Re: Flexibles Pluginsystem: Diskussion
Meiner Erfahrung nach gibt es zwei Probleme bei der Plugin/DLL-Geschichte:
* Strings * Objekte und Klassen Strings und alle nicht Basistypen wie integer, char, pointer (damit auch pchar) [was ist mit variants?] verursachen in DLLs Probleme. Hängt mit dem Speichermanager zusammen, kann jeder nachlesen, steht da wenn man eine neue DLL erstellt. Lösung hier ein anderer Speichermanager. Bei Objekten und Klassen ist das ganze schon schwieriger zu lösen. Delphi macht es mit den Laufzeit Packages. Der Kern des Problems liegt darin, dass Delphi wissen muss dass ein "TObject" aus der Anwendung auch ein "TObject" aus der DLL ist. Was ja nicht der Fall sein muss, wenn die beiden mit verschiedenen Versionen erstellt wurden. Also wirft das hier erst einmal eine Exception:
Delphi-Quellcode:
Das zieht sich durch die ganze Klassenhierarchie und macht sich immer wieder durch Laufzeitfehler bemerkbar.
// code in der Anwendung, ObjektAusDLL wurde zuvor von der DLL initialisiert
// z.B. mit ObjektAusDLL := TFormDLL.create( nil); return ObjektAusDLL if not(ObjektAusDLL is TObject) then raise Exception.create('Nicht mit Anwendungs-RTL kompatibel'); // z.B. ObjektAusDLL.Parent := self; Die Lösung hier sind Interfaces, so zwar konsequent so, dass die Anwendungs-RTTI und die DLL-RTTI nicht miteinander in Berührung kommen. Denn Interfaces nutzen GUID's, die Sprachunabhängig definiert sind und so beliebig funktioneren. D.h. man hat am besten als Include oder "interface"-Unit
Delphi-Quellcode:
und bindet diese sowohl in die Anwendung als auch in die DLL ein. Das ist wichtig damit die GUID in beiden identisch sind.
// ['{3F2504E0-4F89-11D3-9A0C-0305E82C3301}'] ist die GUID für das interface
// kopiert aus dem wikipedia Artikel zu "Globally Unique Identifier" IUnserInterface = interface ['{3F2504E0-4F89-11D3-9A0C-0305E82C3301}'] damit ist eine Abfrage erfolgreich:
Delphi-Quellcode:
Man abstrahiert demnach das Identifizieren von gleichen Typen auf eine compiler- und plattformunabhängige Art.
dllInstanz := GetDLLInterface;
if dllInstanz is IUnserInterface then ShowMessage( 'Alles ok'); ACHTUNG: Damit ist es aber immer noch nicht möglich Steuerelemente die in der DLL erstellt werden in der Anwendung zu benutzen! Ein Panel aus der DLL wird nicht auf einer Anwendungsform korrekt funktionieren, da die interne Struktur auf oben genannte Probleme keine Rücksicht nimmt! |
Re: Flexibles Pluginsystem: Diskussion
Ok das ist zwar alles schön und gut aber.. wie kann man eine DLL zur Laufzeit laden und das noch mit flexiblem Dateinamen oO?
Nur mal so als Beispiel:
Delphi-Quellcode:
Das steht im interface Bereich.. wie bekomme ich so ein "icmp.dll" dynamisch zugeordnet?
function IcmpCreateFile : THandle; stdcall; external 'icmp.dll';
|
Re: Flexibles Pluginsystem: Diskussion
Mir stellt sich da die Frage wie ich so ein Plugin in die Menüstruktur / Befehlstruktur einfüge:
Das Plugin muß eine Anmelderoutine haben wo es in Listenform angibt welche Befehle es anbietet und welche Menuenamen diese Befehle haben. Eine Andere Vairante ist das es selbst ein Panel anbietet wo die einzelnen Befehle als Ereignisse hinterlegt sind. Bei anmelden des Plugins wird dann der Parent auf ein Panel der Hauptanwendung gelegt... Grüße // Martin |
Re: Flexibles Pluginsystem: Diskussion
Zitat:
Zitat:
1. Du könntest für Plugins einen befehl bereitstellen der das MenuItem erstellt und verschiedene erreignisse zurückgibt. 2. Oder was glaube ich einfacher ist das du das Parent Object auf Anfrage übergibst und sie dann selber sich eine menü struktur anlegen können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz