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

程序建立步骤

步骤一、在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

Cpp代码  

  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.

Cpp代码  

  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

Cpp代码  

  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

Cpp代码  

  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

时间: 2024-11-01 22:50:10

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

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

目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS2008+Qt4.7.4 最近看了不少Qt的DLL例子,总结一下如何创建和调用QT 动态链接库. 先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数的调用

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

qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #include <QtGui>  //光标类的父类 //再在public成员中声明换的函数void keyPressEvent(QKeyEvent *k); //声明按键换图的函数         .h文件    --注意头文件和声明 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

QT开发(三十八)——Model/View框架编程

QT开发(三十八)--Model/View框架编程 一.自定义模型 1.自定义只读模型 QAbstractItemModel为自定义模型提供了一个足够灵活的接口,能够支持数据源的层次结构,能够对数据进行增删改操作,还能够支持拖放.QT提供了 QAbstarctListModel和QAbstractTableModel两个类来简化非层次数据模型的开发,适合于结合列表和表格使用. 自定义模型需要考虑模型管理的的数据结构适合的视图的显示方式.如果模型的数据仅仅用于列表或表格的显示,那么可以使用QAbs

qt学习(一)qt三个文件函数的框架

学到点什么, 而不是复制着什么, 每天敲着别人给的代码,苦涩得改完bug, 就这样一天天的过去, 实质上并没有学到什么, 别人的思想只是拿来借鉴, 你的思想是好是坏都是你的, 不用急着抛弃自己. 从qt看看人家的思路. Qt编程思路: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 以下:xxx.h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

嵌入式linux QT开发(三)——GUI原理分析

嵌入式linux QT开发(三)--GUI原理分析 一.命令行程序 命令行程序是面向过程的程序设计. 命令行程序的特点: A.基于顺序结构执行 B.程序执行过程中不需与用户交互 C.程序执行结束给出最终运行结果 命令行程序适用场合: A.单任务场合 B.无交互.简单交互场合 C.服务器应用场合 二.GUI程序 GUI程序的特点: A.基于消息驱动模型的程序 B.程序执行依赖用户交互过程 C.程序执行过程中实时响应用户操作 D.一般程序执行后不会主动退出 GUI程序适用场合: A.多任务场合 B.

QT开发(三十一)——NotePad实例开发

QT开发(三十一)--NotePad实例开发 一.界面开发 NotePad使用主窗口作为顶层窗口组件,使用QMainWindow作为基类,QMainWindow内部封装了菜单栏.工具栏.中央组件.停靠组件.状态栏等.QMainWindow内置了布局管理器,基本的组件布局如下: 使用二阶构造模式构建NotePad界面. MainWindow::MainWindow() {     resize(800, 600); }   MainWindow::~MainWindow() {   }   Mai

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

运行效果 工程目录 Counter |--- Counter.pro |--- 头文件 |      |--- aboutdialog.h |      `--- mainwindow.h |--- 源文件 |      |--- aboutdialog.cpp |      |--- main.cpp |      `--- mainwindow.cpp `--- UI文件 |--- aboutdialog.ui `--- mainwindow.ui 总结 项目 这个工程的Ui部分我是直接使用

QT开发(三十四)——QT多线程编程

QT开发(三十四)--QT多线程编程 一.QT多线程简介 QT通过三种形式提供了对线程的支持,分别是平台无关的线程类.线程安全的事件投递.跨线程的信号-槽连接. QT中线程类包含如下: QThread 提供了开始一个新线程的方法    QThreadStorage 提供逐线程数据存储    QMutex 提供相互排斥的锁,或互斥量    QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁    QReadWriterLock 提供了一个可以同时读操作的锁    QReadL

QT开发(三十五)——QT进程间通信

QT开发(三十五)--QT进程间通信 Qt 是一个跨平台的应用框架,其进程间通信机制当然可以使用所在平台的进程间通信机制,如在Windows平台上的Message机制.共享内存.文件映射.管道.Socket等.其中,Qt对一些许多平台共有的IPC机制进行了封装. 一.TCP/IP 其实就是通过网络模块实现的IPC.不过Qt对其进行了封装,并提供了两个层次的API,包括应用程序级的QNetworkAccessManager, QFtp等和底层的QTcpSocket, QTcpServer, QSs