Qt6之调用Windows下vc生成的动态链接库dll

您所在的位置:网站首页 qt动态库加载内存不足 Qt6之调用Windows下vc生成的动态链接库dll

Qt6之调用Windows下vc生成的动态链接库dll

2024-07-13 08:19:59| 来源: 网络整理| 查看: 265

Qt是跨平台工具,显然能和windows的动态库一起使用。

在Windows操作系统上,库以文件的形式存在,并且可以分为动态链接库(DLL) 和静态链接库两种。动态链接库文控以.dll为后缀名,静态链接库文控以.lib为后缀名。不管是动态链接库还是静态链接库,都是向它们的调用者提供变量、函数或举。

实质上,windows系统库主要以dll动态库为主,所以会在C:\Windows\System32下有大量的dll结尾的库文件。

⚠️windows下理论概念比较多适合萌新消化,大佬绕行!

 一、简述动态链接库

动态链接库的源码就是函数或类的具体实现,源码经过编译后会生成一个后缀名为dll的文件,这个文件就是动态链接库文件,是一个二进制形式的文件,不可以单独运行,必须和它的调用者一起运行。它通常可以向其调用者提供变量、函数或类。

1、调用者(或称为使用者) 可以是应用程序 (exe程序) 或其他动态链接库;

2、提供给调用者调用的函数通常被称为导出函数;

3、提供给调用者使用的类通常被称为导出类。

动态链接库经过编译后会生成一个.lib文控和一个.dll文件,这里的.lib文件不是指静态链接库文件,而是导入库文文件,虽然后缀名和静态链接库文控相同,但是两者没有任何关系。

从调用来分,又有以下两种区别:

隐式链接:在程序执行的时候,就将DLL文件加载到应用程序中;

显式链接:应用程序在执行过程中随时可以添加DLL文件,也可以随时卸载DLL文件,这是隐式链接无法做到的,所以显示链接具有更好的灵活性,对于解释性言语更为合适。

.lib导入库文件中存放的是DLL文控中导出函数的名称和地址,应用程序采用隐式链接动态链接库时,会把导入库文控中的内容(导出函数或类的名称和地址) 复制到应用程序的代码中,当应用程序运行时,就能知道动态链接库中导出函数(或类) 的地址了。

 二、动态链接库dll的分类

简单的说把DLL分为非MFC DLL(又称Win 32 DLL)和MFC DLL。

非MFC DLL (Non-MFC DLL) 也称Win32 DLL,它指的是不用MFC的类库结构直接用C或者C++编写的DLL,其导出的函数是标准的C或者c++接口,能被非MFC或MFC编写的应用程序所调用。如果建立的DLL不需要使用MFC,那么应该建立Non-MFC DLL,因为使用MFC会增大用户库的大小,会浪费用户的磁盘和内存空间。

MFC DLL意味着可以在这种DLL的内部使用了微软的MFC库,这种情况不属于本文讨论范围之内;

三、动态链接库dll开发和调用

一个有用的DLL,首先要把DLL中的变量、函数或类导出,再编译生成dll文件。导出就是对那些要给外部程序使用的变量、函数或类进行声明。

通常有两种导出方式:

第一种方式是通过关键字 declspec(dllexport)导出;

另一种是采用模块定义文件.def导入文件(大部分情况下用的少不做演示);

无论采用哪种方法编译,最终都会生成dll文件和lib文件 (导入库文件)。

3.1 通过关键字 declspec(dllexport)导出

使用关键字 declspec(dllexport)可以从DLL导出数据、函数、类或类成员函数。这种方式比较简单,只要导出的内容前加 declspec(dllexport)即可。以下vs中演示第一种:

(1)、vs新建,动态链接库DLL;

 (2)、项目名称,勾选将解决方案和项目放在同一目录;

 (3)、默认会打开dllmain.cpp,直接关闭就行;

 (4)、项目,鼠标右键,添加,类;

(5)、输入类名;

 

(5)、AddDll.h和AddDll.cpp分别如下;

注意:其类型声明前面加上“__declspec (dllexport)”,为什么这里没有用到类,实测QLibrary调用的win32 dll必须是c语言,如果是C++必用qt自身创建dll。  

 

 

 

(6)、一般情况下最终都是需要Release版本都,我这里改Debug为Release,然后生成;

(7)、在项目Release目录下,找到我们需要动态链接库dll文件和lib文件 (导入库文件)

 3.2通过Qt调用dll

Qt调用DLL的导出函数有4种方法:

第一种是使用Win32 API:

第二种是使用Qt自身的API:

第三种是直接调用DLL:

第四种是Qt Creator可视化调用法,点点鼠标即可。

(1)、使用win32api

这种方法主要使用win32的api函数LoadLibrary(), 这种方法已经使用较少了,有兴趣的可参考下文;

(4条消息) 3.利用Win32 API调用DLL_api调用dll方法_深山里的小白羊的博客-CSDN博客icon-default.png?t=N4P3https://blog.csdn.net/qq_33757398/article/details/81564522

(2)、使用Qt自身的API函数QLibrary类

该方法是比较常用的一种,以下演示一下:

需要注意的是QLibrary:: resolve函数中,明确说明,该符号必须作为 C 函数从库中导出。 #include "mainwindow.h" #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QLibrary lib; QString str1 = QApplication::applicationDirPath(); qDebug()


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭