最近在做QT相关的项目,需要用到DLL,看了下网上的有关QT创建DLL的教程,大多数都是在QT Creator里面的。基于Visual Studio的非常少,这里就记录下自己走过的那些坑。

准备工作.在VS2015里面创建DLL项目以及调用DLL的GUI(方便自测试,图中的DllTest就是目标Dll文件,UIDll就是为了测试它的GUI)

关于DLL的调用,我从网上找到如下几种方法,第二种方法和第一种类似,我就没有验证了。

先讲一下对QT动态链接库的调用方法,主要包括:
1、显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法
2、显示链接DLL,调用DLL中类对象、成员函数。(通过对象即可实现类成员函数的调用)
    ①用虚函数表的方法,这也是COM使用的方法,利用Qt的QLibrary技术调用;
    ②用GetProcAddress直接调用。
    ③用Qt的QPluginLoader类直接调用生成的DLL插件类对象

3、隐式链接DLL:也是采用Qt的Qlibrary方法

方法一

1.在DllTest.h里面如下编写

#pragma once#include "dlltest_global.h"class DLLTEST_EXPORT DllTest
{
public:DllTest();
};
//extern "C"为了声明属于C的函数
extern "C" DLLTEST_EXPORT int getVersion();

2.在DllTest.cpp里面实现此方法

#include "DllTest.h"
#include <QDebug>DllTest::DllTest()
{qDebug() << "";
}int getVersion()
{return 100;
}

3.然后切还到UIDll的工程里面,在UIDll里面的main.cpp里面实现调用的过程(先可以不考虑备注掉的内容,那是第二种方法用到的内容)

#include "UIDll.h"
#include <QtWidgets/QApplication>
#include <QLibrary>
#include <QDebug>
//#include "../DllTest/DllTest.h" 
typedef int(*FUN)();//此处定义函数指针

int main(int argc, char *argv[]){QApplication a(argc, argv);//int result = getVersion();QLibrary lib("DllTest.dll");//此处就是DLL的位置,需要将Dll放在UIDll.exe的根目录,我的路径是..\DllTest\Win32\Debugif (lib.load()){qDebug() << "load ok!";FUN getVer = (FUN)lib.resolve("getVersion");if (getVer)//刚开始我写的DLL函数老是load error,原因就是在DLLTest里面没有用extern "C"用了C函数也需要和它匹配{qDebug() << "load gerVersion ok!";int a = getVer();}else{qDebug() << "load error!!";}}//*/UIDll w;w.show();return a.exec();}

总结:方法一我折腾比较久的就是DllTest里面的函数定义,因为类型错误折腾了很久。按照以上代码是可以成功的。此方法缺点是调用函数的时候写的代码会比较多。

方法二(隐式链接DLL):

1.DllTest里面的写法没有变化。

2.main.cpp的内容只有少许变化,但是以下几步非常重要

        ①include DllTest.h文件

#include "../DllTest/DllTest.h" //此处是最重要的,一些基于QT Creator的教程都教你去写资源文件,在VS2015里面此处直接include就可以

②附加目录里面添加DllTest.lib的路径

③输入里面添加DllTest.lib的名称

#include "UIDll.h"
#include <QtWidgets/QApplication>
#include <QLibrary>
#include <QDebug>
#include "../DllTest/DllTest.h" //此处是最重要的,一些基于QT Creator的教程都教你去写资源文件,在VS2015里面此处直接include就可以typedef int(*FUN)();int main(int argc, char *argv[])
{QApplication a(argc, argv);int result = getVersion();//隐式调用其实只有这一句话,你就可以调用DllTest里面的函数了/*QLibrary lib("DllTest.dll");if (lib.load()){qDebug() << "load ok!";FUN getVer = (FUN)lib.resolve("getVersion");if (getVer){qDebug() << "load gerVersion ok!";int a = getVer();}else{qDebug() << "load error!!";}}//*/UIDll w;w.show();return a.exec();
}

以下是执行成功的截图

总结:这种方法在使用的时候非常方便,适用于函数比较多的时候,只需要把.lib和头文件,dll文件三者包含进来,操作非常简单。

如果有问题欢迎添加微信公众号 程序猿从入门到放弃 进行咨询:

利用QT5.9创建并调用DLL(基于Visual Studio 2015)相关推荐

  1. 如何调用DLL (基于Visual C++6.0的DLL编程实现)

    如何调用DLL (基于Visual C++6.0的DLL编程实现) http://www.programfan.com/article/showarticle.asp?id=2923 一.前言 自从微 ...

  2. html5开发桌面程序调用dll,使用Visual Studio开发Html5应用

    Visual Studio 一直以来是开发微软旗下应用的利器,只要是开发微软相关的应用无论是Windows程序,WPF,Asp.Net,WinRT Surface,WindowsPhone 等微软旗下 ...

  3. Microsoft visual studio 2015已停止工作及项目创建失败解决方法

    Microsoft visual studio 2015已停止工作 问题明细信息 问题签名:   问题事件名称: CLR20r3   问题签名 01: devenv.exe   问题签名 02: 14 ...

  4. C#创建和调用DLL

    一.写在前面 C# 语言是一种简单但功能强大的编程语言,用于编写企业应用程序. C# 语言从C和 C++语言演化而来,在语句.表达式和运算符方面使用了许多 C++ 功能. C# 语言在类型安全性.版本 ...

  5. 利用C语言创建和使用DLL文件

                有感于讲C语言的DLL文件的文章很少,自己查了半天,写了这么个非常简单的教程.自己也是摸C语言不久,依然感觉处于编程苦手的阶段. 1)为什么使用DLL文件 C语言复用代码有很多 ...

  6. 基于Visual Studio 2003/2005的Office插件开发FAQ

    最近处理了好几个Office Addin的问题,总结出一些经验,在此与大家分享一下. 首先介绍一些注意点 1. 一定要把宏安全级别设置为Medium以下,默认是High,肯定不允许运行任何Addin, ...

  7. 基于Visual Studio Code 的佳明穿戴设备APP开发平台的搭建

    本文以图文方式详细介绍了基于Visual Studio Code软件的佳明穿戴设备APP开发平台的搭建步骤.环境变量设置方法以及平台运行环境的设置等,为佳明穿戴设备APP的开发者提供了详尽的教程和参考 ...

  8. LVGL 之 windows 上 lvgl 模拟器基于 Visual Studio 搭建方法的简单整理

    LVGL 之 windows 上 lvgl 模拟器 基于 Visual Studio 搭建方法的简单整理 目录 LVGL 之 windows 上 lvgl 模拟器 基于 Visual Studio 搭 ...

  9. Visual Studio 2015和2017里面应该创建哪种 Class Library

    微软有些时候是一副不讲道理的大家长作风.一个例子就是它在 Visual Studio 2015/2017 里面配置了一大堆普通人没法理解的 Class Library 模板. 你真的知道应该选哪个吗? ...

最新文章

  1. 那时刚毕业的我,曾参与惊心动魄 3Q 大战
  2. 如何给6个整数的一维数组某个元素赋值_数组指针详解
  3. MXNET学习笔记(二):模型的保存与加载
  4. 域名到期续费删除的相关规则
  5. PHP权重算法-用于游戏根据权限来随机物品
  6. ios解锁动态图片_iOS 苹果开机启动的 滑动来解锁动画
  7. 腾讯云COS对象存储图片文件API的详细步骤过程
  8. js上传视频,预览视频
  9. iOS工作中的经验总结—马甲包审核以及常见审核问题
  10. AngularJs学习笔记--directive
  11. 基于Spring boot的云客服系统实现
  12. idea项目列表名称与项目名称不一致
  13. Ubuntu18.04图标显示实时网速
  14. 面向对象-抽象类与接口
  15. 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
  16. 2022年终总结——脚踏实地,勇敢做自己
  17. BIOS密码清除方法--unlock6的使用.
  18. 新手上路,如何迅速搭建一套源码系统
  19. STM32h743开启cache后ADC采集DMA数据不更新问题
  20. hadoop统计文件行数

热门文章

  1. spring boot练习--利用websocket实现QQ聊天室
  2. 【手绘漫画】面试必考之手撕双链表(解题模板和深度剖析),(LeetCode 707)
  3. 2019年大数据技术与应用专业24个省份130所学校招生
  4. CF 770 B(奇偶性), C(规律)
  5. 计算机不能进入桌面,电脑进不了桌面,电脑开机进不了桌面解决方法全集
  6. golang端口重用
  7. 左益豪:用代码创造一个新世界|OneFlow U
  8. 陈欧体程序员版And各种版本
  9. 因向欺诈者出售数据,Epsilon向美国司法部支付1.5亿美元罚款
  10. spring in action 学习笔记五:@Autowired这个注解如何理解