PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt-Plugins: So richtig oder gehts einfacher?



peschmae
01-08-2004, 13:48
Da ich Infos nur bröckchenweise gefunden habe und ein entsprechender Thread auf mrunix.de nicht abrufbar ist hab ich mich mal an einem Test-Plugin-Progrämmchen versucht.

interface.h


#ifndef INTERFACE_H
#define INTERFACE_H
class QString;

class Interface {
public:
virtual QString* getText() = 0;
};
#endif


Dann ein kleines Testplugin dazu:

testplugin.h


#ifndef TESTPLUGIN_H
#define TESTPLUGIN_H

class QString;

#include "interface.h"

extern "C" {
Interface* getPlugin();
}

class TestPlugin : public Interface {
public:
virtual QString* getText();
};
#endif


testplugin.cpp


#include "testplugin.h"

#include <qstring.h>

#include <iostream>

Interface* getPlugin() {
return new TestPlugin();
}

QString* TestPlugin::getText() {
std::cout << "**** TestPlugin::getText() invoked" << std::endl;
return new QString("**** QString - Returnvalue from Testplugin");
}


Und schliesslich das Programm

main.cpp


#include "interface.h"

#include <qlibrary.h>

#include <qstring.h> //only as Return Value is QString
#include <iostream> //only for testoutput

typedef Interface* (*getPlugin)();

int main(int argc, char *argv[]) {
std::cout << "bla" << std::endl;
QLibrary lib( "testplugin" );
getPlugin pl = (getPlugin) lib.resolve("getPlugin");
Interface* i = pl();
QString* s = i->getText();
std::cout << *s << std::endl;
}


Der Code funktioniert unter Linux (Debian mit Qt 3.3.2, gcc 3.3) und Windows (Qt 3.1.x, MinGW mit gcc 3.4)

Muss ich das alles so kompliziert machen oder gehts auch ein bisschen einfacher?
Am liebsten würde ich die extern "c"-Funktion eliminieren, so dass man für ein Plugin nur noch das Interface includen und die virtual-Methoden überladen muss.

Download der Quellen inkl. QMake .pro-Datein (http://home.pages.at/peschmae/plugin.tar.bz2)

MfG Peschmä

anda_skoa
01-08-2004, 20:25
Du kannst das extern "C" ja in den Header geben, in dem auch das Interface spezifiziert ist.

Das musst du dann ohnehin inkludieren.

Btw: eher QString statt QString* benutzen. QString ist intern geshared, man verliert also nicht allzuviel Performance durch das Erzeugen der neuen Instanz, aber ich finde man gewinnt Sicherheit, weil man als Aufrufer immer ganz sicher ein funktionierendes QString Objekt erhält und auch nicht in der Doku nachgeschlagen werden muss, wer nach Aufruf der Besitzer des Pointers ist (wer ihn löschen muss)

Ciao,
_

peschmae
01-08-2004, 20:54
Danke für die Tipps. Funktioniert prächtig soweit.

Nein, nicht nur soweit. Ganz :)
Die Frage die ich eben stellen wollte hat sich schon beantwortet (kaum guckt man mal die richtige Seite im Stroustroup an :D)

Dann werde ich die Pluginnerei mal an einem Program austesten das so klein ist dass das tendentiell Irrsinn ist ;)

MfG Peschmä