利用QT5.9创建并调用DLL(基于Visual Studio 2015)
最近在做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"
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)相关推荐
- 如何调用DLL (基于Visual C++6.0的DLL编程实现)
如何调用DLL (基于Visual C++6.0的DLL编程实现) http://www.programfan.com/article/showarticle.asp?id=2923 一.前言 自从微 ...
- html5开发桌面程序调用dll,使用Visual Studio开发Html5应用
Visual Studio 一直以来是开发微软旗下应用的利器,只要是开发微软相关的应用无论是Windows程序,WPF,Asp.Net,WinRT Surface,WindowsPhone 等微软旗下 ...
- Microsoft visual studio 2015已停止工作及项目创建失败解决方法
Microsoft visual studio 2015已停止工作 问题明细信息 问题签名: 问题事件名称: CLR20r3 问题签名 01: devenv.exe 问题签名 02: 14 ...
- C#创建和调用DLL
一.写在前面 C# 语言是一种简单但功能强大的编程语言,用于编写企业应用程序. C# 语言从C和 C++语言演化而来,在语句.表达式和运算符方面使用了许多 C++ 功能. C# 语言在类型安全性.版本 ...
- 利用C语言创建和使用DLL文件
有感于讲C语言的DLL文件的文章很少,自己查了半天,写了这么个非常简单的教程.自己也是摸C语言不久,依然感觉处于编程苦手的阶段. 1)为什么使用DLL文件 C语言复用代码有很多 ...
- 基于Visual Studio 2003/2005的Office插件开发FAQ
最近处理了好几个Office Addin的问题,总结出一些经验,在此与大家分享一下. 首先介绍一些注意点 1. 一定要把宏安全级别设置为Medium以下,默认是High,肯定不允许运行任何Addin, ...
- 基于Visual Studio Code 的佳明穿戴设备APP开发平台的搭建
本文以图文方式详细介绍了基于Visual Studio Code软件的佳明穿戴设备APP开发平台的搭建步骤.环境变量设置方法以及平台运行环境的设置等,为佳明穿戴设备APP的开发者提供了详尽的教程和参考 ...
- LVGL 之 windows 上 lvgl 模拟器基于 Visual Studio 搭建方法的简单整理
LVGL 之 windows 上 lvgl 模拟器 基于 Visual Studio 搭建方法的简单整理 目录 LVGL 之 windows 上 lvgl 模拟器 基于 Visual Studio 搭 ...
- Visual Studio 2015和2017里面应该创建哪种 Class Library
微软有些时候是一副不讲道理的大家长作风.一个例子就是它在 Visual Studio 2015/2017 里面配置了一大堆普通人没法理解的 Class Library 模板. 你真的知道应该选哪个吗? ...
最新文章
- 那时刚毕业的我,曾参与惊心动魄 3Q 大战
- 如何给6个整数的一维数组某个元素赋值_数组指针详解
- MXNET学习笔记(二):模型的保存与加载
- 域名到期续费删除的相关规则
- PHP权重算法-用于游戏根据权限来随机物品
- ios解锁动态图片_iOS 苹果开机启动的 滑动来解锁动画
- 腾讯云COS对象存储图片文件API的详细步骤过程
- js上传视频,预览视频
- iOS工作中的经验总结—马甲包审核以及常见审核问题
- AngularJs学习笔记--directive
- 基于Spring boot的云客服系统实现
- idea项目列表名称与项目名称不一致
- Ubuntu18.04图标显示实时网速
- 面向对象-抽象类与接口
- 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
- 2022年终总结——脚踏实地,勇敢做自己
- BIOS密码清除方法--unlock6的使用.
- 新手上路,如何迅速搭建一套源码系统
- STM32h743开启cache后ADC采集DMA数据不更新问题
- hadoop统计文件行数
热门文章
- spring boot练习--利用websocket实现QQ聊天室
- 【手绘漫画】面试必考之手撕双链表(解题模板和深度剖析),(LeetCode 707)
- 2019年大数据技术与应用专业24个省份130所学校招生
- CF 770 B(奇偶性), C(规律)
- 计算机不能进入桌面,电脑进不了桌面,电脑开机进不了桌面解决方法全集
- golang端口重用
- 左益豪:用代码创造一个新世界|OneFlow U
- 陈欧体程序员版And各种版本
- 因向欺诈者出售数据,Epsilon向美国司法部支付1.5亿美元罚款
- spring in action 学习笔记五:@Autowired这个注解如何理解