Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问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(从上面的项目拷贝过来的)

程序建立步骤
步骤一、在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还得继承接口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。
- 将前面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();
- }
- else
- qDebug() << "instance fail";
- return a.exec();
- }
综合了网上很多的例子,很难直接运行,最后自己总结出来的例子在附件上,可以直接运行。
那些参考链接,就不一一引用了,在此谢谢各位的帮助!
http://qimo601.iteye.com/blog/1402501
Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL的更多相关文章
- Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good
目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...
- Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)
Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...
- 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)
使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...
- Qt计算器开发(三):执行效果及项目总结
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guodongxiaren/article/details/26046543 执行效果 project ...
- 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包
Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...
- qt学习(三):鼠标图标改变
qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #i ...
- QT学习(三)
首先整理一下编码的方法.对于一个待解决的问题,首先应该将大问题分解成小问题,将小问题划分为小小问题... 然后再进行类的抽象,将划分成的问题和类进行对应.然后再对划分的小..问题进行具体的处理分析,划 ...
- 基于uFUN开发板的心率计(三)Qt上位机的实现
前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...
- 【Qt开发】01-第一个Qt程序Hello World!
一:说在前头 我的第一份工作是做生产工具,当时用的MFC,IDE是VC6.0,现在想想真是古董级别,10年至今,微软也一直没有对MFC进行升级, 冥冥中感觉微软自己都放弃MFC了,市场上貌似MFC的岗 ...
随机推荐
- sparksql parquet 合并元数据
java public class ParquetMergeSchema { private static SparkConf conf = new SparkConf().setAppName(&q ...
- 微信小程序要调数据 微信小程序 for 循环详解
现在要完成这样的效果: 我的代码是: <view class="l-setlist clr" > <template name="listab" ...
- 静态资源命名的注意点以及document.write与innerHTML的区别
今天拿出了去年刚开始学前端的那本书来看,发现好多新东西. 使用下划线和混合大小写不利于SEO! document.write与innerHTML的区别 这个问题大概是初学前端的人才会问的吧,业务代码中 ...
- Objective-C的基础数据结构
类的数据结构 Class(指针) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 typedef struct objc_c ...
- BCGControlBar介绍
第一次翻译有诸多不正确的地方,还忘各位指正,谢谢! 英文原文:http://www.bcgsoft.com/bcgcontrolbarpro.htm BCGControlBar是MFC的一个扩展库其英 ...
- Twitter "like" 动画实战
http://zhuanlan.zhihu.com/FrontendMagazine/20486738
- python3使用Lxml库操作XPath
download address: http://pypi.python.org/pypi/lxml/2.3 lxml is a Pythonic, mature binding for the li ...
- modern-cpp-features
C++17/14/11 Overview Many of these descriptions and examples come from various resources (see Acknow ...
- Qt使用预编译头文件Using Precompiled Headers(提升10倍以上)
预编译头文件是被很多编译器用来编译稳定的代码以及将编译好的稳定代码存储在二进制文件中用于提升编译性能.在随后的编译中,编译器将加载存储状态继续编译指定的文件.每一个随后的编译将更快,因为稳定的代码不需 ...
- python短信轰炸机版本smsbomb----------部分(post)
用一些用手机号注冊且须要发送验证码的站点的漏洞.能够向不论什么人的手机号发送短信,当然短信内容,我们无法控制.所以主要工作还是寻找这种站点.然后利用Fiddler或者HttpWatch分析请求.使用p ...