Mit QPluginLoader eigene Plugins mehrfach laden

Alles rund um die Programmierung mit Qt
Antworten
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Mit QPluginLoader eigene Plugins mehrfach laden

Beitrag von René »

Hallo,

wir möchten eine plugin-fähige Qt-Applikation entwicklen, die in der Lage ist mit verschiedenen Schnittstellen zu kommunizieren. Jede Schnittstelle (RS232, USB, Ethernet) soll dabei als Plugin realisiert sein.

Ich habe mir dazu die Qt-Dokumentation zur Klasse QPluginLoader und den Abschnitt "How to Create Qt Plugins" angeschaut.

Wenn ich das richtig verstanden habe, dann kann man zwar über mehrere QPluginLoader-Instanzen ein und dasselbe Plugin mehrfach laden, man bekommt allerdings immer nur einen Zeiger auf dasselbe Objekt im Speicher zurück. Es wird also erkannt, dass ein Plugin bereits geladen ist, es wird keine neue Plugin-Instanz erzeugt.

Um mich zu vergewissern, habe ich ein kleines Demo-Programm geschrieben, welches zwei QPluginLoader Instanzen erzeugt, die dasselbe Plugin laden. Beide geben auch wie dokumentiert einen Zeiger auf denselben Speicherbereich zurück. Dieser Speicherbereich wird erst freigegeben, wenn alle QPluginLoader-Instanzen die Funktion unload() aufgerufen haben.

Jetzt möchten wir aber gerne in der Lage sein, dieselbe Schnittstelle (also dasselbe Plugin) mehrfach zu laden und unterschiedlich zu konfigurieren. Beispielsweise brauchen wir mehrere Instanzen eines RS232-Plugins, eine Instanz soll mit COM1 und mit der Baudrate 57600 kommunizieren, die andere Instanz desselben Plugins soll mit COM3 und der Baudrate 38400 kommunizieren.

Wie kann man das sinnvoll lösen? Oder ist das Qt-Plugin-System dafür nicht der richtige Weg?

Danke für Eure Hilfe im Voraus.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wenn ihr weiterhin QtPlugin verwenden wollt, dann macht aus dem geladenen Plugin eine Factory, die die eigentlichen Plugin-Instanzen über eine eigene Funktion erzeugt.
Oder ihr verzichtet auf QtPlugin, und nehmt stattdessen QLibrary. Eine freie Factory-Methode als extern "C" in jedem Plugin zum Laden anbieten (ihr braucht ja einen einheitlichen Symbolnamen, der mit QLibrary::load() geladen werden soll). Damit habt ihr halt dann keine automatische Versionsüberprüfung.
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Danke für deine Antwort. Wir diskutieren gerade darüber ob es nicht generell sinnvoller ist, jede Schnittstelle als eigenen Prozess laufen zu lassen, ähnlich wie die modernen Browser es mittlerweile mit ihren Plugins wie Adobe Flash tun.

Damit würden wir dann komplett auf QPluginLoader verzichten.
Antworten