目录
Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL
开发环境:VS2008、Qt4.7.4,附件有源码可供下载
最近在总结如何访问DLL中的类对象及其成员函数,其中一种方法利用Qt的QPluginLoader类就可以方便快捷的访问DLL中的类,以及其中的类成员函数。
文件结构如下图:
解决方案名:TestPlugin
1、Qt的Library项目(PluginDll):PlugInterface.h、PluginInstance.h、PluginInstance.cpp
2、Qt的Console Application项目(PluginConsole):main.cpp、PlugInterface.h(从上面的项目拷贝过来的)
步骤一、在VS里新建立一个DLL项目,名称PluginDll。
// PlugInterface.h //接口类 #ifndef PLUGINTERFACE_H #define PLUGINTERFACE_H #include <QtPlugin> class PlugInterface { public: virtual ~PlugInterface(){} //接口中的成员函数必须是纯虚函数 virtual void testPlugin() = 0; virtual void helloWorld() = 0; }; QT_BEGIN_NAMESPACE //这个宏用声明接口 //Q_DECLARE_INTERFACE(接口类名,接口标识符) Q_DECLARE_INTERFACE(PlugInterface, "PlugInterfaceDll/1.0"); QT_END_NAMESPACE #endif // PLUGINTERFACE_H //接口标识符必须唯一,所以一般加个版本号1. //This macro is normally used right after the class definition for ClassName, in a header file. //If you want to use Q_DECLARE_INTERFACE with interface classes declared in a namespace, //then you have to make sure the Q_DECLARE_INTERFACE is not inside a namespace though.
// PluginInstance.h //业务类的头文件 #ifndef PLUGININSTANCE_H #define PLUGININSTANCE_H #include "PlugInterface.h" #include <QObject> //PluginInstance必须继承QObject类,才能使用如下Qt的方法 //PluginInstance还得继承接口PlugInterface class PluginInstance : public QObject, PlugInterface { Q_OBJECT //Q_INTERFACES宏定义告诉Qt MOC,PluginInstance类继承了插件PlugInterface //将该接口注册到Qt的meta-object system Q_INTERFACES(PlugInterface) public: PluginInstance(); ~PluginInstance(); //业务成员1 void testPlugin(); //业务成员2 void helloWorld(); }; #endif // PLUGININSTANCE_H
// PluginInstance.cpp //业务类成员函数定义 #include "PluginInstance.h" #include <QtCore> PluginInstance::PluginInstance() { } PluginInstance::~PluginInstance() { } void PluginInstance::testPlugin() { qDebug() << "test"; } void PluginInstance::helloWorld() { qDebug() << "helloWorld"; } //这个宏用来导出动态链接库 //Q_EXPORT_PLUGIN2(插件名, 类名) //Q_EXPORT_PLUGIN2("PluginDll", PluginInstance) Q_EXPORT_PLUGIN2("PluginInstance", PluginInstance) //插件名最好和TARGET有关,而我们PluginDll项目转换成Qt项目的.pro文件,target = PluginDll //所以说这里名字不影响编程,只是为了方便理解,让插件名和项目名一致最好。 //对于一个Qt插件来说,最好只有一个Q_EXPORT_PLUGIN2宏定义,并且最好在实现的文件里出现,而非头文件中。
步骤二、在VS里新建立一个ApplicationL项目,名称PluginConsole。
#include <QtCore/QCoreApplication> #include "PlugInterface.h" #include <QPluginLoader> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); PlugInterface *plugObject; //不知道为啥,路径我写成下面就出错呢?编译可以通过,运行时会提示异常 //QPluginLoader pluginLoader("PluginDll.dll"); //加载插件 QPluginLoader pluginLoader("../Debug/PluginDll.dll"); // QObject *plugin = pluginLoader.instance(); if (plugin) { qDebug() << "instance success"; //使用qobject_cast将QObject类型转换成我们想要的PlugInterface类对象 plugObject= qobject_cast<PlugInterface *>(plugin); plugObject->helloWorld(); plugObject->testPlugin(); } else qDebug() << "instance fail"; return a.exec(); }
综合了网上很多的例子,很难直接运行,最后自己总结出来的例子在附件上,可以直接运行。
那些参考链接,就不一一引用了,在此谢谢各位的帮助!