首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > VSTS >

Qt DLL小结【三】-VS2008+Qt 使用QPluginLoader访问DLL

2012-09-23 
Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL?目录Qt DLL总结【一】-链接库预备知识Qt DLL总结【二】-

Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL

?

目录

Qt DLL总结【一】-链接库预备知识

Qt DLL总结【二】-创建及调用QT的 DLL??

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(从上面的项目拷贝过来的)

?

Qt DLL小结【三】-VS2008+Qt 使用QPluginLoader访问DLL

?

?

程序建立步骤

?

?

步骤一、在VS里新建立一个DLL项目,名称PluginDll。

    ? ? ?把自动生成的三个代码文件(PluginDll.h、PluginDll_global.h、PluginDll.cpp)直接删掉,这三个是Qt自己的建立Qt Dll的推荐方法,我们暂时用不到。? ? ?自己新建如下三个文件PlugInterface.h、PluginInstance.h、PluginInstance.cpp ? ?
    备注:如果步骤一建立成一个exe应用项目,也可以通过改两个项目配置参数实现,生成DLL。
    一是修改Configuration Properties/General/Configuration type的值,将Application (.exe)改成Dynamic Library (.dll)?,
    二是修改Configuration Properties/Linker/General/Output File 的值,将$(OutDir)\$(ProjectName).exe改成$(OutDir)\$(ProjectName).dll
// 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还得继承接口PlugInterfaceclass PluginInstance : public QObject, PlugInterface{Q_OBJECT//Q_INTERFACES宏定义告诉Qt MOC,PluginInstance类继承了插件PlugInterface//将该接口注册到Qt的meta-object systemQ_INTERFACES(PlugInterface)public:PluginInstance();~PluginInstance();//业务成员1void testPlugin();//业务成员2void 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。

    ? ??将前面PluginDll项目中的接口头文件PlugInterface.h拷贝到PluginConsole项目中;? ? 因为plugin.dll已经在解决方案的Debug文件中了,暂时就不需要拷贝到PluginConsole项目中来了。如果没有需要拷贝过来才能引用
    在main.cpp中通过QPluginLoader调用PluginDll.dll
#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();}elseqDebug() << "instance fail";return a.exec();}
?

综合了网上很多的例子,很难直接运行,最后自己总结出来的例子在附件上,可以直接运行。
那些参考链接,就不一一引用了,在此谢谢各位的帮助!

热点排行