Also habe ich eine Anwendung, die stark auf der QT-API basiert, die das QPlugin-System verwendet. Es ist ziemlich einfach zu verwenden, Sie definieren eine Klasse, die von einer Schnittstelle erbt und wenn das Plugin geladen wird, erhalten Sie eine Instanz dieser Klasse. Am Ende wird es auf ein dlopen
/dlsym
oder LoadLibrary
/GetProcAddress
herunterkochen, was auch immer für das Betriebssystem geeignet ist. Ich habe keine Probleme hier funktioniert alles wie erwartet.Plugin API Design
Also, auf das Problem. Es gibt ein Los der Funktionalität, die ein Plugin beinhaltet, das sich auf Daten/Funktionen beziehen muss, die von der Hauptanwendung bereitgestellt werden. Zum Beispiel hat meine Anwendung eine GUI, also habe ich in meiner Anwendung eine "plugin::v1::gui
" -Funktion, die eine QWidget *
zurückgibt. Wenn ich möchte, dass ein Plug-in in der Lage ist, Dinge zu meiner Benutzeroberfläche hinzuzufügen, oder sogar den Dialog zu einem Kind meiner Benutzeroberfläche zu machen, benötigt es einen Zeiger darauf.
Ich begann die Entwicklung unter Linux und stieß schnell auf die Tatsache, dass der Loader standardmäßig nicht aufgelöste Symbole in geteilten Objekten mit denen aus der Anwendung, die ihn laden, füllt. Kein Problem, einfache Lösung. füge "-rdynamic
" zu meinen Flaggen hinzu und gehe weiter. Das funktioniert gut.
Jetzt habe ich entdeckt, dass es keine äquivalent unter Windows zu sein scheint :(. Also, was ist eine gute Lösung?
Bisher ist die beste, die ich habe kommen mit einer Struktur I füllen Sie in meiner Hauptanwendung, die Zeiger auf jedes Objekt/Funktion hat ein Plug-in möglicherweise kümmern dann an die Funktion "init()
" Plugins und jetzt hat es richtige Hinweise auf alles, aber es ist eine lästige Lösung, da jetzt muss ich machen Änderungen an mehreren Stellen, wenn ich etwas hinzufüge.
Gibt es eine bessere Lösung? Wie hat die SO-Community damit umgegangen?
Hier ist ein guter Artikel, der im Detail erklärt, wie Plugins auf diese Weise zu erreichen sind: http://www.nuclex.org/articles/building-a-better-plugin-architecture#comment-738 – joshperry