QT(51)-动态链接库-windows
1.qt- 调用win32 DLL
2.qt- 调用MFC DLL
0概述:
01.扩展DLL:
必须有一个DllMain()函数,且调用AfxInitExtensionModule()函数。
CRuntimeClass类-初始化函数CDynLinkLibrary。
02.windows定位DLL文件:
1)exe同一目录
2)进程当前目录GetCurrentDirectory()
3) windows系统目录 GetSystemDirectory() c:\windows\system32
4) windows目录 GetWindowsDirectory() c:\windows
5) 列在path环境变量中的一系列目录。
03.32位和64位不能混用
EXE 和DLL需要位数相同。
04. def 文件:
041:VC6.0创建dll文件时自动生成.def文件,但里面没有函数名,只表名这是一个DLL文件。
; myvcdll.def : Declares the module parameters for the DLL.LIBRARY "myvcdll"
DESCRIPTION 'myvcdll Windows Dynamic Link Library'EXPORTS; Explicit exports can go here
042:VS2019下创建DLL时不会生成.def文件。
05.dll和exe在同一个文件夹下:
单独运行EXE时如果出现如下错误:
修改环境变量:把编译使用的路径放到最上面,且重启机器。
这是原来的:
06 dll和exe的文件编码要一致。
1.qt- 调用win32 DLL
1.1 DLL文件编写 :关键字+.def模块文件
1.11 导出方式:关键字 _declspec(dllexport)mydll.h
C++:支持重载机制,处理函数名,加入函数的返回类型。
C: 没有extern “C”时会提示,函数找不到的错误码(DWORD dw=::GetLastError();,得到dw=127)
1.111 mydll.h头文件如下创建,可被QT和VS创建的exe调用:
#ifndef _MYDLL_H //防止重复引用
#define _MYDLL_H# ifdef __cplusplus //如果这是一段cpp代码,那么加入 extern"C"{} 处理其中的代码。
extern "c"{
#endif_declspec(dllexport) void f();
_declspec(dllexport) int min(int a, int b);#ifdef __cplusplus
}
#endif
#endif
1.112 mydll.h头文件如下创建 ,只能被VS创建的exe调用:
#define MYDECLARE_PUBLIC extern "C" _declspec(dllexport)_declspec(dllexport) void myDLL(void);
1.12 mydll.cpp
#include "mydll.h"
void f()
{MessageBox(0,_T("你好,世界"),0,0);
}
1.12 模块定义文件:(.def+.h+.cpp)
1.121.testdll.def文件:文件中的函数名就是要导出的函数名
LIBRARY MYDLL; //可有可无,DLL名称
DESCRIPTION "这是我的DLL"; //可有可无,DLL的解释EXPORTS //必须有 后面是函数名或者变量名f1f2
@ordinal 允许用序号导出函数,而不是以函数名导出。
1.122.tesdll.h 文件
#ifndef _TEST_H
#define _TEST_H //防止重复引用#include "tchar.h" //为了使用_Tint f1(TCHAR *sz,int n); void f2();#endif
1.123.testdll.cpp文件
#include "Test.h"
#include "windows.h" //为了使用MessageBoxint f1(TCHAR *sz, int n)
{MessageBox(0,sz, 0, 0);return n;
}void f2()
{MessageBox(0, _T(" 你好,f2"), 0, 0);
}
1.2DLL调用
1.21隐式链接
导入.lib文件。
包含头文件。
exe中调用dll中的函数和类。
配置:
1.211导入.lib 文件:
链接器->常规->附加库目录:lib库目录
链接器->输入->附加依赖项:lib文件名
1.212包含头文件:
C/C++->常规->附加包含目录
1.213 exe中调用dll中的函数
#include "../test//mydll.h"
#pragma comment(lib, "mydll.lib") //隐式链接方式void myexe::OnBnClickedpbt()
{f(); //调用dll中的f() 函数
}
2.qt- 调用MFC DLL
2.11win32 API
2.12qt自身的API
2.13直接调用DLL
2.14可视化设置
2.11.加载DLL::LoadLibrary(L"D:\C++\myDll\mydll.dll");
2.12. 得到导出函数的地址:lpfnDllFunc1 = (FUNC)GetProcAddress(hDLL,"f");
2.13.释放句柄:FreeLibrary(hDLL);
#include <windows.h>
#include <QMessageBox>
typedef void (* FUNC) (); void Dialog::on_pushButton_clicked()
{DWORD dw;HINSTANCE hDLL; // Handle to DLLFUNC lpfnDllFunc1; // Function pointerQString str;//1.加载hDLL = ::LoadLibrary(L"D:\C++\myDll\mydll.dll");if (hDLL){//2.得到函数句柄lpfnDllFunc1 = (FUNC)GetProcAddress(hDLL,"f");if (!lpfnDllFunc1){dw = ::GetLastError();FreeLibrary(hDLL);str.sprintf("GetProcAddress failed:%d",dw);QMessageBox::information(this,"Error code",str);}else{//3. 调用函数+释放句柄lpfnDllFunc1();FreeLibrary(hDLL);}}else{dw = ::GetLastError();str.sprintf("Load dll failed:%d",dw);QMessageBox::information(this,"Error",str);}
}
2.12 calldefdll
2.121创建项目
2.122 dll ,lib, def 文件放在同一路径下。
.def 指定导出函数的具体名字。
EXPORTSf1f2
mydll.h
#ifndef _TEST_H
#define _TEST_H //防止重复引用#include "tchar.h" //为了使用_Tint f1(TCHAR *sz,int n); void f2();#endif
mydll.cpp
int f1(char *sz,int n)
{MessageBoxA(0,sz,0,0);return n;
}
2.12QT自身的API
2.21加载动态库文件 QLibrary myLib("mydll") //动态链接库文件的基本名:mylib 非文件名。
是否成功:isLoaded()
得到函数地址:resolve()
卸载:unload()
被加载动态库
void Dialog::on_pushButton_clicked()
{Qlibrary lib("myDll");}
2.13直接调用DLL
2.131 .lib.dll文件放入exe同一路径下。
2.132 exe文件编写:
2.1321exe工程配置文件 .pro文件 导入.lib文件
LIBS += -L$$PWD/ ./ -lmydll
// -L 导入库路径 相对路径 $$PWD 当前路径 -l库的基本名(没有后缀的文件名)
LIBS += -LD:\QTPrj\build-code_qbytearray-Desktop_Qt_5_14_2_MinGW_32_bit-Debug\debug -lmydll
// -L 导入库路径 绝对路径
2.1322exe新建.h文件,mydll.h 与DLL中的不是一个!!
ADD new...
#ifndef MYDLL_H
#define MYDLL_Hextern "C" void f();
#endif // MYDLL_H
2.1323 exe中.cpp文件编写
#include "myDll.h"void MainWindow::on_pushButton_clicked()
{myDLL();
}
2.14可视化设置
相关文章:
QT(51)-动态链接库-windows
1.qt- 调用win32 DLL 2.qt- 调用MFC DLL 0概述: 01.扩展DLL: 必须有一个DllMain()函数,且调用AfxInitExtensionModule()函数。 CRuntimeClass类-初始化函数CDynLinkLibrary。02.windows定位DLL文件: 1)…...
[Vivado那些事儿]将自定义 IP (HDL)添加到 Vivado 模块设计(Block Design)
绪论使用Vivado Block Design设计解决了项目继承性问题,但是还有个问题,不知道大家有没有遇到,就是新设计的自定义 RTL 文件无法快速的添加到Block Design中,一种方式是通过自定义IP,但是一旦设计的文件有问题就需要重…...
开学必备数码清单,大学生开学必备数码好物分享
还有很多小伙伴不知道开学应该准备什么,在学校当中需要用到的数码产品,在宿舍娱乐使用的音箱、学习当中使用到的笔记本,这些都是我们可以准备的,还有一个小众的好物,能够让我们在学校当中提升生活的幸福感,…...
【面试题】常见前端基础面试题(HTML,CSS,JS)
大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库html语义化的理解代码结构: 使页面在没有css的情况下,也能够呈现出好的内容结构有利于SEO: 爬虫根据标签来分配关键字的权重,因此可以和搜索引擎…...
Vue (4)
文章目录1. 绑定样式1.1 绑定 class 样式1.2 绑定 style 样式2. 条件渲染2.1 v-show2.2 v-if3. 列表渲染3.1 v-for3.2 key 的作用与原理3.3 列表过滤3.4 列表排序1. 绑定样式 说 绑定样式 前,先准备好 以下几个 样式 : <style>.basic {width: 400px;height: 1…...
静态库和动态库的制作
一、什么叫做库: 库:二进制的程序,能被操作系统载入内存中执行 二、Linux下的库有两种:静态库和共享库(动态库),二者的不同点在于代码载入的时刻不同。 A、静态库在程序编译的时候并会被连接到目标代码中,程…...
Oracle实现高可用性的工具(负载均衡/故障切换)
Oracle实现高可用性的工具(负载均衡/故障切换)1 Oracle RAC故障转移负载均衡2 Data Guard负载均衡-读写分离Data Guard Broker3 GDSGSM:连接管理工具主要功能Data Guard Broker功能是监控Data Guard状态,当主库异常时自动切换角色…...
图解经典电路之OCL差分功放-三极管分立器件电路分析
下面从简到繁,从框架到细节的顺序讲解电路。即先讲框架,然后逐渐添加电路细节,所以大家跟上思路。 1、第一步,尽可能的抽象这个电路,等效如下: 图二 OCL等效电路 整个OCL电路,可以等效为一个大功率的运放,加上几个电阻电容构成了一个同向放大器,就是这么简单。 为了便…...
thymeleaf模板注入学习与研究--查找与防御
一、日常编码中常见的两种漏洞场景 1.1 模板参数外部可控 RequestMapping("/path")public String path(RequestParam String lang) {return lang ;}实际开发过程中 依靠我丰富的想象力只能想出 换主题 这种场景下可能会出现 大佬们自行脑补吧。 1.2 使用GetMappin…...
第七章:Linux最小化搭建环境解说2
配置IP地址:我们先要到网卡配置文件夹里,路径是/etc/sysconfig/network-scripts/,有点长,不过没事,我们要学会习惯,这还是经常用的。然后就是用ls命令查看下面有什么,只有一个文件ifcfg-ens160&…...
两道链表经典算法题---链表有无环(基础+进阶)
生活就像一盒巧克力,你永远不知道你会得到什么。——《阿甘正传》目前自己粗略的学完数据结构,正在开始刷算法题目。个人觉得算法是一个积累,循序渐进的的过程,需要不断加量,进而达到所谓的质。链表作为数据结构一个重…...
2023/1/14总结
今天学习的是c语法知识。 容器arry: 通俗来说这个容器就i是c语言的数组,和C中vevtor不同,arry是定长度的,而vector是动态数组。头文件为:<arry> 初始化: arry<数据类型,你所要声明…...
Python 之 NumPy 统计函数、数据类型和文件操作
文章目录一、统计函数1. 求平均值 mean()2. 中位数 np.median3. 标准差 ndarray.std4. 方差 ndarray.var()5. 最大值 ndarray.max()6. 最小值 ndarray.min()7. 求和 ndarray.sum()8. 加权平均值 numpy.average()二、数据类型1. 数据存储2. 定义结构化数据3. 结构化数据操作三、…...
互联网新时代要到来了(一)什么是Web3.0?
什么是Web3.0? tips:内容来自百度百科、知乎、搜狐新闻、李留白公众号、CSDN「Meta.Qing」博客等网页 什么是Web3.0?1.什么是Web3.0(概念介绍)?2.Web3.0简单理解3.Web3.0的技术特点4.Web3.0项目1.什么是Web3.0(概念…...
[Yocto] 直接向deploy/images目录部署binary
最近用yocto的时候碰到一个问题,有一些IP的FW binary是从别的地方直接拿来的,没有source code,有一个需求就是需要把它用wks script的方式把它们打包到最后的image里,这篇文章就是来谈谈这个问题。 yocto patch/deploy等做了什么 首先,虽然我们的code,bbfile,或者说pa…...
HarmonyOS Connect原子化服务功能开发(Wi-Fi/Combo)设备控制开发与实现(二)
规设备控制 在“device”目录下的“DeviceApplication.java”文件中,在onInitialize函数中初始化应用。示例代码如下: Override public void onInitialize() {AiLifeServiceHelper.initApplication(this);DeviceHandlerAbility.register(this, "&qu…...
浅析 Makefile
Makefile逻辑 Makefile就是将一系列的工作流串在一起自动执行,构成Makefile最基本的要素是目标、依赖、命令。也就是为了实现目标需要哪些依赖并执行什么样的命令。 target: dependences1 dependences2 ... command1 command2 ...其中,target表示要生…...
保护品牌线上声誉的5种方法
我们如今生活在一个搜索便捷的世界,对于一个企业和个人来说,品牌的线上声誉也尤为重要。在客户考虑与您的公司开展业务之前,他们理所当然会先使用众多软件和平台搜索相关信息,以帮助他们了解和做决定。 因此,您的品牌…...
Java多重选择结构,超详细整理,适合新手入门
目录 一、什么是多重选择结构? 二、if 语句的语法 1、什么是嵌套if语句? 2、if 语句循环基本用法: 3、案例: 二、if...else多重选择结构语法 1、什么是if-else语句? 2、if...else 循环基本用法 3、案例&#…...
SCI写作,一定要避开这些“雷点”!
SCI论文写作中,除了要符合各部分的写作要求,还有许多细节问题需要我们注意,不然可能一不小心就会“踩雷”。 今天我们就来和大家分享SCI各个部分写作时的注意事项。 下面就进入正题! SCI写作注意事项 01 标题的拟定 1.避免使用无…...
3GPP-NR Band14标准定义频点和信道(3GPP V17.7.0 (2022-12))
Reference test frequencies for NR operating band n14 Table 4.3.1.1.1.14-1: Test frequencies for NRoperating band n14 and SCS 15 kHz CBW [MHz]carrierBandwidth...
分库分表索引设计:分布式环境下的 主键索引、二级索引、全局索引的最佳设计实践
文章目录主键选择索引设计全局表唯一索引总结结语主键选择 对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。 因为自增并不能在插入前就获得值…...
2023年全国最新保安员精选真题及答案
百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题(1-480题)以下备选答案中只有一项最符合题目要求&a…...
计算机网络之http07 http2,http3
HTTP1.2 http1.2都做了哪些优化 (1)头部压缩 使用HPACK压缩头部 头部冗长,大量重复字段 (2)二进制帧 将报文头部和内容字符编码改为二进制格式 字符编码未压缩 (3)并发传输 解决h1.1 队头阻塞问题,多车道 …...
内网渗透(二十五)之Windows协议认证和密码抓取-使用Hashcat和在线工具破解NTLM Hash
系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...
TongWeb8防止System.exit代码导致的进程停止
现象:当应用中存在System.exit 、Runtime.exit代码执行时,会导致TongWeb进程停止,从而产生如下日志:2023-02-14 09:47:36 [WARN] - The web application [webtest01] is still processing a request that has yet to finish. This…...
PMP每年考几次,费用如何?
一,PMP每年考几次,怎么准备? PMP项目管理证书是美国PMI发起的在全球200多个国家进行的项目管理专业人士资格认证,它的含金量和给认证者带来的作用已经很明显。 PMP考试是项目管理专业人士资格认证考试,通过PMP考试是…...
【Kubernetes】【一】Kubernetes介绍
Kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定…...
C语言:结构体
往期文章 C语言:初识C语言C语言:分支语句和循环语句C语言:函数C语言:数组C语言:操作符详解C语言:指针详解 目录往期文章前言1. 结构体的声明2. 结构体变量的定义和初始化3. 结构体成员的访问3. 结构体传参…...
搭建pclpy环境与读取pandaset数据并转换为pkl格式为pcd格式
1.搭建pclpy环境 问题:需要处理pcd文件,于是开始摸索搭建环境,有python-pcl,但是安装过程频频出现问题,于是转向pclpy。 参考链接:GitHub - davidcaron/pclpy: Python bindings for the Point Cloud Libr…...
wordpress html 单页/黑马it培训班出来现状
element-UI 根据table中数据改变颜色 或显示对应内容 1、根据table中数据的值改变显示颜色,效果:代码: <el-table-column prop"countdown" label"剩余天数(天)" width"95"><template scope"scop…...
做苗木选择哪个网站/简单网页设计模板html
题目链接 https://www.nowcoder.com/practice/5af18ba2eb45443aa91a11e848aa6723?tpId37&tqId21237&tPage1&rp&ru/ta/huawei&qru/ta/huawei/question-ranking 题目描述 给定n个字符串,请对n个字符串按照字典序排列。 输入描述: 输入第一行…...
装修公司谁做网站/百度快照关键词推广
。 这是一个简单的累加程序,您可以使用以下代码实现: sum 0 for i in range(1, 10001):sum i print(sum)这个程序将从1加到10000,并输出累加的总和。...
百度怎么搜索到自己的网站/文案代写
1、给出导致进程状态转换的事件: (1)运行→就绪,1种; (2)创建→就绪,1种; (3)运行→阻塞,3种; (4)阻塞→就绪,3种; (5)运行→终止,4种 答: …...
网站pr查询/深圳优化公司哪家好
成绩表score的结构: 如何查询每门课程最高分的学生的学号,课程号,成绩? 答案: select t1.sid,t1.cid,t1.score from score t1 where t1.score (select max(t2.score)from score t2where t2.cid t1.cidgroup by t2.c…...
织梦网站 三级域名/广州抖音seo公司
P1182 数列分段 Section II judge函数是判断是否满足在规定区间的个数内满足每个区段和小于等于mid。 开始一直纠结为啥是小于等于,就一直找题解,后来自己想了想就想明白了:ta[i]要小于等于x,是加上后的条件满足,就可…...