QPluginLoader läd Plugin nicht

Alles rund um die Programmierung mit Qt
Antworten
thereapman
Beiträge: 36
Registriert: 6. Juni 2007 15:39

QPluginLoader läd Plugin nicht

Beitrag von thereapman »

Hi Leute!

Ich häng grad voll fest.
Hab ein Programm das mit Hilfe von QPluginLoader ein Plugin laden soll.
Das Programm baut und das Plugin baut auch. Habs mittlerweile alles mehrfach mit der Doku von trolltech und den Beispielen abgeglichen.
Hab extra 2 neue Projekte gemacht zum Testen.
Er wills aber einfach nicht laden. Windows oder Linux is egal. hab ich beides probiert.

als Fehler wirft er mit immer nur "Unknown Error" hin.

Hier der Quelltext vom Programm:
ModuleInterface.h - Die Schnittstelle

Code: Alles auswählen

#ifndef MODULEINTERFACE_H_
#define MODULEINTERFACE_H_

#include <QtPlugin>
#include <QString>

class ModuleInterface
{
public:
	virtual ~ModuleInterface() {}
	virtual QString pluginInfo() = 0;
};

QT_BEGIN_NAMESPACE
	Q_DECLARE_INTERFACE(ModuleInterface, "KBS.KBSTrade.ModuleInterface/1.0");
QT_END_NAMESPACE
#endif /* MODULEINTERFACE_H_ */

TestLoader.h - Klasse die das Plugin laden soll

Code: Alles auswählen

#ifndef TESTLOADER_H_
#define TESTLOADER_H_

#include <QtCore>

class TestLoader : public QObject
{
	Q_OBJECT

public:
	TestLoader();
	virtual ~TestLoader();

	void loadPlugin();

};

#endif /* TESTLOADER_H_ */
TestLoader.cpp - Klasse die das Plugin laden soll

Code: Alles auswählen


//includes,De und konstrukor hab ich mal weggelassen

void TestLoader::loadPlugin()
{
	qDebug() << "Loader running";
	QPluginLoader loader("srvplugin.dll");
	if(loader.isLoaded())
		qDebug() << "Loading OK";
	QObject *instance = loader.instance();
	if(instance)
	{
		qDebug() << "Plugin instanced";
		qDebug() << loader.errorString();
		ModuleInterface *module = qobject_cast<ModuleInterface *>(instance);
		if(module)
			module->pluginInfo();
	}

	qDebug() << loader.errorString();
}
SrvPlugin.h - Das Plugin

Code: Alles auswählen

#include <QtCore>
#include <QObject>
#include <QString>
#include "ModuleInterface.h"

class SrvPlugin : public QObject, public ModuleInterface
{
	Q_OBJECT
	Q_INTERFACES(ModuleInterface)

public:
	QString pluginInfo();
};
SrvPlugin.cpp

Code: Alles auswählen

#include "SrvPlugin.h"

QString SrvPlugin::pluginInfo()
{
	return "Hallo Welt vom Plugin";
}

Q_EXPORT_PLUGIN2(srvplugin, SrvPlugin);

Und noch die .pro Files
Programm:

Code: Alles auswählen

TEMPLATE = app
TARGET = PluginServer
QT += core
HEADERS += ModuleInterface.h \
    TestLoader.h
SOURCES += TestLoader.cpp \
    main.cpp
FORMS += 
RESOURCES += 
CONFIG += console
Plugin:

Code: Alles auswählen

TEMPLATE   = lib
CONFIG    += plugin
QT        += core 
HEADERS   += SrvPlugin.h
SOURCES   += SrvPlugin.cpp
DESTDIR    = ../PluginServer
TARGET     = srvplugin
INCLUDEPATH    += ../PluginServer

Wo steh ichn aufm Schlauch?

Achja das EchoPlugin-Beispiel baut auf beiden Systemen find aber den unterschied zu meinem nich.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Der Fehler liegt im Namen des Plugins :P
Pre- und Postfix des plattformabhängigen Lib-Namens gehören WEG!
Wenn dein Plugin also auf der Festplatte unter dem Namen "srvplugin.dll" liegt, musst du es als "srvplugin" mit den QPluginLoader laden.
Ebenso unter Linux wäre es statt "libsrvplugin.so" ein "srvplugin"
Sonst wäre ja die ganze Plattformunabhängigkeit dahin :)

Hättest du aber selber rausfinden können, wenn du einem der zahlreichen Links in der Doku zu QLibrary gefolgt wärst ;)

Grüße
Franz
thereapman
Beiträge: 36
Registriert: 6. Juni 2007 15:39

Beitrag von thereapman »

Hmm das geht aber schief. Wenn ich dem QPluginLoader "srvplugin" statt "srvplugin.dll" mitgebe bekomm ich den Fehler das er die shared Library nich findet.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ok, sry, das ist wohl nur bei library so (wahrscheinlich bei pluginLoader auch, wenn das Plugin in einem LibraryPfad liegt)

Dein UnknownError kommt daher, weil es einfach keinen Error gibt :P Laden klappt, Instanzist nicht NULL, qobject_cast geht auch OK.
Dein Fehler:
pluginInfo() gibt einen String zurück. Wenn du den nicht z.B. an ein qDebug() übergibst, kommt auch nix auf die Konsole :D
Also in TestLoader::loadPlugin() einfach das hier

Code: Alles auswählen

qDebug() << module->pluginInfo();
Außerdem wäre es für mich einfacher gewesen, wenn ich gleich ein Zip bekommen hätte, dort zweimal qmake und make und fertig. So hab ich alles selber anlegen müssen, und auch noch erraten wie deine Verzeichnisstruktur ausschaut. Denke das ist für viele Gestresste ein Hinderungsgrund, deine Problematik näher zu verfolgen. Wirst bessere/schnellere Antworten krigen, wenn du ein Testprogramm gleich in ein Zip als Anhang mitgibst :)

Hoffe aber das Problem ist jetzt geklärt.

Grüße
Franz
thereapman
Beiträge: 36
Registriert: 6. Juni 2007 15:39

Beitrag von thereapman »

Narf. Den Wald vor lauter Bäumen nicht gesehn. danke
Antworten