目录

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

程序建立步骤

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

  1. 把自动生成的三个代码文件(PluginDll.h、PluginDll_global.h、PluginDll.cpp)直接删掉,这三个是Qt自己的建立Qt Dll的推荐方法,我们暂时用不到。
  2. 自己新建如下三个文件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
  1. // PlugInterface.h
  2. //接口类
  3. #ifndef PLUGINTERFACE_H
  4. #define PLUGINTERFACE_H
  5. #include <QtPlugin>
  6. class PlugInterface
  7. {
  8. public:
  9. virtual ~PlugInterface(){}
  10. //接口中的成员函数必须是纯虚函数
  11. virtual void testPlugin() = 0;
  12. virtual void helloWorld() = 0;
  13. };
  14. QT_BEGIN_NAMESPACE
  15. //这个宏用声明接口
  16. //Q_DECLARE_INTERFACE(接口类名,接口标识符)
  17. Q_DECLARE_INTERFACE(PlugInterface, "PlugInterfaceDll/1.0");
  18. QT_END_NAMESPACE
  19. #endif // PLUGINTERFACE_H
  20. //接口标识符必须唯一,所以一般加个版本号1.
  21. //This macro is normally used right after the class definition for ClassName, in a header file.
  22. //If you want to use Q_DECLARE_INTERFACE with interface classes declared in a namespace,
  23. //then you have to make sure the Q_DECLARE_INTERFACE is not inside a namespace though.
  1. // PluginInstance.h
  2. //业务类的头文件
  3. #ifndef PLUGININSTANCE_H
  4. #define PLUGININSTANCE_H
  5. #include "PlugInterface.h"
  6. #include <QObject>
  7. //PluginInstance必须继承QObject类,才能使用如下Qt的方法
  8. //PluginInstance还得继承接口PlugInterface
  9. class PluginInstance : public QObject, PlugInterface
  10. {
  11. Q_OBJECT
  12. //Q_INTERFACES宏定义告诉Qt MOC,PluginInstance类继承了插件PlugInterface
  13. //将该接口注册到Qt的meta-object system
  14. Q_INTERFACES(PlugInterface)
  15. public:
  16. PluginInstance();
  17. ~PluginInstance();
  18. //业务成员1
  19. void testPlugin();
  20. //业务成员2
  21. void helloWorld();
  22. };
  23. #endif // PLUGININSTANCE_H
  1. // PluginInstance.cpp
  2. //业务类成员函数定义
  3. #include "PluginInstance.h"
  4. #include <QtCore>
  5. PluginInstance::PluginInstance()
  6. {
  7. }
  8. PluginInstance::~PluginInstance()
  9. {
  10. }
  11. void PluginInstance::testPlugin()
  12. {
  13. qDebug() << "test";
  14. }
  15. void PluginInstance::helloWorld()
  16. {
  17. qDebug() << "helloWorld";
  18. }
  19. //这个宏用来导出动态链接库
  20. //Q_EXPORT_PLUGIN2(插件名, 类名)
  21. //Q_EXPORT_PLUGIN2("PluginDll", PluginInstance)
  22. Q_EXPORT_PLUGIN2("PluginInstance", PluginInstance)
  23. //插件名最好和TARGET有关,而我们PluginDll项目转换成Qt项目的.pro文件,target = PluginDll
  24. //所以说这里名字不影响编程,只是为了方便理解,让插件名和项目名一致最好。
  25. //对于一个Qt插件来说,最好只有一个Q_EXPORT_PLUGIN2宏定义,并且最好在实现的文件里出现,而非头文件中。

步骤二、在VS里新建立一个ApplicationL项目,名称PluginConsole。

  1. 将前面PluginDll项目中的接口头文件PlugInterface.h拷贝到PluginConsole项目中;
  2. 因为plugin.dll已经在解决方案的Debug文件中了,暂时就不需要拷贝到PluginConsole项目中来了。如果没有需要拷贝过来才能引用
    在main.cpp中通过QPluginLoader调用PluginDll.dll
  1. #include <QtCore/QCoreApplication>
  2. #include "PlugInterface.h"
  3. #include <QPluginLoader>
  4. #include <QDebug>
  5. int main(int argc, char *argv[])
  6. {
  7. QCoreApplication a(argc, argv);
  8. PlugInterface *plugObject;
  9. //不知道为啥,路径我写成下面就出错呢?编译可以通过,运行时会提示异常
  10. //QPluginLoader  pluginLoader("PluginDll.dll");
  11. //加载插件
  12. QPluginLoader  pluginLoader("../Debug/PluginDll.dll");
  13. //
  14. QObject *plugin = pluginLoader.instance();
  15. if (plugin)
  16. {
  17. qDebug() << "instance success";
  18. //使用qobject_cast将QObject类型转换成我们想要的PlugInterface类对象
  19. plugObject= qobject_cast<PlugInterface *>(plugin);
  20. plugObject->helloWorld();
  21. plugObject->testPlugin();
  22. }
  23. else
  24. qDebug() << "instance fail";
  25. return a.exec();
  26. }

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

http://qimo601.iteye.com/blog/1402501

Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL的更多相关文章

  1. Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  2. Qt5.7中使用MySQL Driver(需要把libmysql.dll文件拷贝到Qt的bin目录中。或者自己编译的时候,链接静态库)

    Qt5.7中使用MySQL Driver 1.使用环境 Qt5.7的安装安装就已经带了MySQL Driver,只需要在安装的时候选择一下即可.如果没有安装,可以采取自己编译的方式.在Qt的源码包的q ...

  3. 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)

    使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...

  4. Qt计算器开发(三):执行效果及项目总结

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guodongxiaren/article/details/26046543 执行效果 project ...

  5. 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...

  6. qt学习(三):鼠标图标改变

    qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #i ...

  7. QT学习(三)

    首先整理一下编码的方法.对于一个待解决的问题,首先应该将大问题分解成小问题,将小问题划分为小小问题... 然后再进行类的抽象,将划分成的问题和类进行对应.然后再对划分的小..问题进行具体的处理分析,划 ...

  8. 基于uFUN开发板的心率计(三)Qt上位机的实现

    前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...

  9. 【Qt开发】01-第一个Qt程序Hello World!

    一:说在前头 我的第一份工作是做生产工具,当时用的MFC,IDE是VC6.0,现在想想真是古董级别,10年至今,微软也一直没有对MFC进行升级, 冥冥中感觉微软自己都放弃MFC了,市场上貌似MFC的岗 ...

随机推荐

  1. 属性动画Property Animation

    ViewPropertyAnimation 使用方式:View.animate() 后跟 translationX() 等方法,动画会自动执行. 注意translationX实现是调用对应的set方法 ...

  2. 【32.26%】【codeforces 620C】Pearls in a Row

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. MATLAB Toolbox Path Cache is out of date and is not being used的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用mcc编译MATLAB\R2009a\extern\examples\compiler目录下的hello.m,编译 ...

  4. 同一性(identical)

    f(x)=x,表明 f(⋅) 为同一函数. A 与 B 具有 360° 的区别 A 向左转,再向右转 ⇒ A A 向左转,向左转,向后转 ⇒ A

  5. C# 静态构造函数,静态变量执行顺序(升华版)

    上篇 是基本语法基础下的执行顺序,包括继承这个维度下的执行顺序,我们可以依照的规律顺下来,下面我们看下一些摸不到头脑的情况 我们实验 一个 类中的方法 去调用另一个非继承类的情况,  我们主要看下  ...

  6. Spring boot quartz的相关资源

    https://github.com/82253452/banner https://github.com/lvhao/schedule-job/tree/master/src/main/java/c ...

  7. JavaScript window.location物

    演示样例 注意 方法 常常使用window.location.它的结构总是记不住.简单梳理下.方便以后查询. 演示样例 URL:http://b.a.com:88/index.php? name=ka ...

  8. Java网络编程注意事项1

    网络编程的基础知识 什么是计算机网络,就是把分布在不同地理区域的计算机与专门的外部设备通信线路互连成一个规模大.功能强的网络系统. 计算机网络主要能做些下面功能: 1)资源共享 2)信息传输与集中处理 ...

  9. 音频、视频等文件格式(.ts、.meta)及其认识

    MPEG:Moving Picture Experts Group,动态图像专家组, JPEG:Joint Photographic Experts Group,联合图像专家组 1. .ts .ts ...

  10. jQuery插件接口的实现,jquery.extend

    http://www.imooc.com/code/3403 如果jQuery没有插件接口的设计,那么他就像个光杆司令没有兵,就是没有手下,只有自己一个封闭的城堡.因此jQuery城堡需要设计一个大门 ...