QT中加载DLL的方式有两种:

一种是静态方式的加载,需要有两个文件:lib文件和dll文件。lib文件就是导入库,里面定义了一些函数符号,在调用的时候会直接查找这些函数符号,然后根据这些函数符号,找到DLL对应的模块加载进来进行调用。

另一种就是动态调用。在使用的时候才会加载dll进来,使用QT本身自己的加载机制,利用QLibrary进行动态加载。

静态加载的方式比较常用,下面介绍一下动态加载的方式:

1.首先创建一个dll项目,一定要选择Qt Class Library:

2.编写DLL程序

#pragma once#include "mainfunc_global.h"
#include <string>class MAINFUNC_EXPORT MainFunc {
public:MainFunc();virtual int add(int a,int b);virtual void printMsg(QString msg);
};extern "C" {//一定要添加上MAINFUNC_EXPORT MainFunc* getDllObj();MAINFUNC_EXPORT char* text();MAINFUNC_EXPORT int printInt();
}

在需要导出的函数上一定要添加上extern “C”,编译器在生成DLL的时候,就会自动的按照C语言的编译方式进行编译,只会编译出函数名,而不会编译上参数类型。

#include "MainFunc.h"
#include <QMessageBox>MainFunc::MainFunc() {
}int MainFunc::add(int a, int b) {return a + b;
}void MainFunc::printMsg(QString msg) {QMessageBox* msgBox = new QMessageBox;msgBox->setText(msg);msgBox->setWindowTitle(QStringLiteral("信息框"));msgBox->show();
}MAINFUNC_EXPORT MainFunc* getDllObj() {return new MainFunc;
}MAINFUNC_EXPORT char* text() {return "Hello World 2019!";
}MAINFUNC_EXPORT int printInt() {return 2019;
}

编译一下就可以生成DLL和相应的LIB文件。

3.动态调用

声明函数指针:

#include <QMessageBox>
#include "../MainFunc/MainFunc.h"
#include <QLibrary>
#include <QDebug>typedef MainFunc* (*getObj)();
typedef char* (*dllText)();
typedef int (*dllPrintInt)();

具体调用过程:

void QtVS2015::slotTest() {QLibrary* mainFunDll = new QLibrary("MainFunc.dll");if (mainFunDll->load()) {getObj obj = (getObj)mainFunDll->resolve("getDllObj");MainFunc* mF = obj();mF->printMsg(QStringLiteral("这是一个DLL调用程序"));qDebug()<<mF->add(4, 7);dllText dText = (dllText)mainFunDll->resolve("text");qDebug() << QString::fromLocal8Bit(dText());dllPrintInt dPrintInt = (dllPrintInt)mainFunDll->resolve("printInt");qDebug() << dPrintInt();} else {QMessageBox* msgBox = new QMessageBox;msgBox->setText(QStringLiteral("动态库加载失败!"));msgBox->setWindowTitle(QStringLiteral("信息框"));msgBox->show();}
}

运行一下就可以了!

aaa

QT动态加载DLL包括加载DLL中的类及其成员函数相关推荐

  1. python类的成员函数_Python实现动态添加类的属性或成员函数的解决方法

    某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或 ...

  2. PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解

    本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...

  3. php php_dbase.dll,php – 如何在Windows中解决“调用未定义函数dbase_open()”错误

    嗨,我想加载DBF文件到 mysql,使用xampp,php版本5.5.6 我写了下面的代码, 但我得到错误- Fatal error: Call to undefined function dbas ...

  4. python类的成员函数_Python为类对象动态添加成员函数

    Python: 为对象动态添加函数 , 且函数定义 来自一个 str 在 Python 中 , 通常情况下 , 你只能为对象添加一个已经写好的方法 需求 : 传入一个 str 类型的变量 , 其值是一 ...

  5. python类的动态方法是什么_如何在python中为类动态创建类方法

    如果我将一个小python程序定义为class a(): def _func(self): return "asdf" # Not sure what to resplace __ ...

  6. DLL简介与MFC DLL

    比较大的应用程序都是由很多模块组成的,这些模块彼此协作,以完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其他软件系统时仍会被使用.在构造软件系统时,如果将所有模块的源代码都静态编译 ...

  7. 定义一个复数类complex,包含两个属性:实部和虚部,包含构造函数,包含成员函数void display()输出,包括成员函数complex add(complex a), 进行复数加法。

    定义一个复数类complex,包含两个属性:实部和虚部,包含构造函数,包含成员函数void display()输出,包括成员函数complex add(complex a), 进行复数加法,在主函数种 ...

  8. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...

    原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件. 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unloa ...

  9. 解决QT出现XXXX.dll不能加载问题

    第一步:下载相关动态链接文件(这里以ig4icd32.dll为例子) 下载地址:ig4icd32.dll文件 第二步:把下载的文件放在两个地方,记住!一定得放在两个地方,我试了少一个都不行! C:\W ...

  10. dll侧加载_动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)...

    动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数. 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 Ge ...

最新文章

  1. 大家买PDA干什么,来看SPB的调查
  2. 利用OpenCV实现人眼的检测与跟踪
  3. Python基础教程(九):面向对象、正则表达式
  4. linux 协议栈 位置,[置顶] Linux协议栈代码阅读笔记(一)
  5. Numpy编写BP传播过程全解
  6. html 换行符_每个非网站开发人员都应该了解的21个HTML基础知识
  7. java监控数据库性能_Java:GraalVM数据库流性能
  8. MYSQL存储过程中 表名 使用变量
  9. springboot指定属性返回_SpringBoot中必须掌握的45个注解
  10. java dvr_java实现海康NVR/DVR设备工作状态获取
  11. 【XAMPP】中mysql的admin页面打不开
  12. 博客迁移至: http://www.cleocn.com
  13. for循环与求值 学习笔记
  14. qt王者荣耀皮肤抽奖器
  15. 海量数据排序问题一一 100G 数据,只有 100M 内存,怎么排序?
  16. 可以学计算机再学美术,想学习板绘?教你如何在电脑学习绘画!
  17. 揭秘:为什么羊毛党可以0元购物?
  18. 2019年全国/全球马拉松比赛日程
  19. Markdown 语法手册全
  20. tiny4412移植uboot-2019-01(三)

热门文章

  1. 关于o1,o2,o3
  2. THUSC2019:Illusory World
  3. 根据不同时区来计算当前时间
  4. 十一条Python学习路线,推荐收藏
  5. 数据安全对物联网越来越重要
  6. 用ybc_box做小程序
  7. 财务人的编程自学之路
  8. 2020国内学者SCIENCE发文盘点,生物类 37 篇 (新冠相关 9 篇)
  9. react--1.react环境搭建、JSX语法、注释、样式、列表渲染、定义单个组件、eact Props、react State
  10. python去马赛克