Entwickler-Ecke

Sonstiges (Delphi) - beliebige Anzahl von Plugins laden


realAndy - Do 08.09.11 15:53
Titel: beliebige Anzahl von Plugins laden
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 - 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.


jaenicke - Fr 09.09.11 00:13

Es gibt ja auch diverse Frameworks und Seiten für den Zweck:
http://www.delphi-forum.de/viewtopic.php?p=571965
http://sourceforge.net/projects/rd-dpf/
http://www.tmssoftware.com/site/tpf.asp
http://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 - 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.


realAndy - 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