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