| Autor |
Beitrag |
realAndy
      
Beiträge: 26
Windows 7
Delphi 2010, Java
|
Verfasst: Do 08.09.11 15:53
Hallo,
ich möchte in einem Delphi Projekt Plugins Dynamisch laden. Das ganze möchte ich mit Hilfe von DLLs machen.
Eine DLL in mein Delphi Projekt einzubinden ist kein Problem. Wie verwalte ich aber eine beliebige Anzahl von DLLs? Kann ich diese über ein Array verwalten? Kann man hiezu jemand einen Tip geben?
Das ganze soll also z.B. ähnlich wie die Pluginverwalung in Firefox funktionieren. Die Plugins sollen dann also in einem Menü angezeigt und gestartet werden können.
Danke für eure Hilfe
Andy
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 08.09.11 23:41
Du musst eine API definieren, die von sowohl deinem Programm als auch deiner DLL genutzt werden kann, um bestimmte Aktionen auszuführen. Also z.B. eine Funktion für Menüeintrag hinzufügen, Menüeintrag löschen, ... Die Schnittstelle, die das Plugin von der Anwendung aufrufen darf, kannst du z.B. in einem Record beim Initialisieren des Plugins übergeben.
Die Verwaltung, welche Plugins es nun gibt, gestaltet sich am einfachsten mit einem Array, wo Du neben dem Pluginnamen, dem DLL-Handle und anderen Laufzeit-Informationen auch z.B. verwaltet, was die jeweilige DLL bei der Anwendung an Funktionen ausgeführt hat (z.B. welche Menüeinträge hinzugefügt wurden), damit Du diese beim Entladen des Plugins einfach wieder entfernen kannst.
Zudem bietet es sich oftmals an, für die Realisierung von Plugin-Systemen im Code der Hauptanwendung sogenannte Hooks zu definieren, also Stellen, wo ein Plugin anmelden kann, dass es beim Aufruf dieser Funktionen benachrichtigt werden möchte. Diese sind vergleichbar mit einfachen Events, mit dem Unterschied, dass sich gleichzeitig mehrere Plugins für ein und den selben Hook interessieren können.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 09.09.11 00:13
Es gibt ja auch diverse Frameworks und Seiten für den Zweck:
www.delphi-forum.de/viewtopic.php?p=571965
sourceforge.net/projects/rd-dpf/
www.tmssoftware.com/site/tpf.asp
pluginmgr.dennislandi.com/
bei den JEDIs ist auch eins dabei, usw.
Ich selbst habe zwei Möglichkeiten bisher genutzt, entweder normale Funktionen, die in einem Objekt zur Verfügung stehen, oder ein Interface vom Typ IUnknown, das direkt aus der DLL kommt.
|
|
HelgeLange
      
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Fr 09.09.11 16:12
in meinem Plugin framework nutze ich objekte, die den Zugriff zu den DLLs regeln. Jedes Plugin bekommt im PluginLoader ein Objekt mit der Standard-Schnittstelle (Einsprungpunkt zur DLL etc). Das Objekt regelt auch initialisation und Entladen allein.
Meine Plugins haben nur eine Standardschnittstelle, über welche ich alles senden kann, ohne dass ich den Inhalt der DLL kenne.
Zum Bsp. sagtt ein Plugin nicht dem Hauptmenü, dass es einen (oder mehrere) Menüpunkte hinzufügen will, sondern das Hauptmenü schleudert ein Event zu den plugins (das kann an alle sein oder, wie in meinem Fall, nur an die, die auch was zum Hauptmenü haben), dass sie jetzt ihre Menüpunkte registrieren können. Damit bleibt die Verwaltung der Menüs dort, wo das Menü ist und Deine Plugins fummeln nicht an fremden Objekten rum, sondern nur an ihren eigenen.
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
realAndy 
      
Beiträge: 26
Windows 7
Delphi 2010, Java
|
Verfasst: Fr 09.09.11 20:11
Danke für eure Antworten
Da ich bereits einige Sachen aus JEDI verwende, würde ich auch das Pluginframework von JEDI nehmen.
Hat jemand hierzu ein kleines Beispiel? Irgendwie will es bei mir nicht so richtig laufen.
Wenn ich über den PluginManager die DLL Laden will, bekomme ich immer eine Fehlermeldung EResNotFound 'Ressource wurde nicht gefunden'. Die DLL selber findet er aber.
Viele Grüße
Andreas
|
|
|