当前位置: 首页 > news >正文

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概述&#xff1a; 01.扩展DLL&#xff1a; 必须有一个DllMain()函数&#xff0c;且调用AfxInitExtensionModule()函数。 CRuntimeClass类-初始化函数CDynLinkLibrary。02.windows定位DLL文件&#xff1a; 1&#xff09…...

[Vivado那些事儿]将自定义 IP (HDL)添加到 Vivado 模块设计(Block Design)

绪论使用Vivado Block Design设计解决了项目继承性问题&#xff0c;但是还有个问题&#xff0c;不知道大家有没有遇到&#xff0c;就是新设计的自定义 RTL 文件无法快速的添加到Block Design中&#xff0c;一种方式是通过自定义IP&#xff0c;但是一旦设计的文件有问题就需要重…...

开学必备数码清单,大学生开学必备数码好物分享

还有很多小伙伴不知道开学应该准备什么&#xff0c;在学校当中需要用到的数码产品&#xff0c;在宿舍娱乐使用的音箱、学习当中使用到的笔记本&#xff0c;这些都是我们可以准备的&#xff0c;还有一个小众的好物&#xff0c;能够让我们在学校当中提升生活的幸福感&#xff0c;…...

【面试题】常见前端基础面试题(HTML,CSS,JS)

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库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. 绑定样式 说 绑定样式 前&#xff0c;先准备好 以下几个 样式 : <style>.basic {width: 400px;height: 1…...

静态库和动态库的制作

一、什么叫做库&#xff1a; 库&#xff1a;二进制的程序&#xff0c;能被操作系统载入内存中执行 二、Linux下的库有两种&#xff1a;静态库和共享库(动态库)&#xff0c;二者的不同点在于代码载入的时刻不同。 A、静态库在程序编译的时候并会被连接到目标代码中&#xff0c;程…...

Oracle实现高可用性的工具(负载均衡/故障切换)

Oracle实现高可用性的工具&#xff08;负载均衡/故障切换&#xff09;1 Oracle RAC故障转移负载均衡2 Data Guard负载均衡-读写分离Data Guard Broker3 GDSGSM&#xff1a;连接管理工具主要功能Data Guard Broker功能是监控Data Guard状态&#xff0c;当主库异常时自动切换角色…...

图解经典电路之OCL差分功放-三极管分立器件电路分析

下面从简到繁,从框架到细节的顺序讲解电路。即先讲框架,然后逐渐添加电路细节,所以大家跟上思路。 1、第一步,尽可能的抽象这个电路,等效如下: 图二 OCL等效电路 整个OCL电路,可以等效为一个大功率的运放,加上几个电阻电容构成了一个同向放大器,就是这么简单。 为了便…...

thymeleaf模板注入学习与研究--查找与防御

一、日常编码中常见的两种漏洞场景 1.1 模板参数外部可控 RequestMapping("/path")public String path(RequestParam String lang) {return lang ;}实际开发过程中 依靠我丰富的想象力只能想出 换主题 这种场景下可能会出现 大佬们自行脑补吧。 1.2 使用GetMappin…...

第七章:Linux最小化搭建环境解说2

配置IP地址&#xff1a;我们先要到网卡配置文件夹里&#xff0c;路径是/etc/sysconfig/network-scripts/&#xff0c;有点长&#xff0c;不过没事&#xff0c;我们要学会习惯&#xff0c;这还是经常用的。然后就是用ls命令查看下面有什么&#xff0c;只有一个文件ifcfg-ens160&…...

两道链表经典算法题---链表有无环(基础+进阶)

生活就像一盒巧克力&#xff0c;你永远不知道你会得到什么。——《阿甘正传》目前自己粗略的学完数据结构&#xff0c;正在开始刷算法题目。个人觉得算法是一个积累&#xff0c;循序渐进的的过程&#xff0c;需要不断加量&#xff0c;进而达到所谓的质。链表作为数据结构一个重…...

2023/1/14总结

今天学习的是c语法知识。 容器arry&#xff1a; 通俗来说这个容器就i是c语言的数组&#xff0c;和C中vevtor不同&#xff0c;arry是定长度的&#xff0c;而vector是动态数组。头文件为&#xff1a;<arry> 初始化&#xff1a; arry<数据类型&#xff0c;你所要声明…...

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&#xff1a;内容来自百度百科、知乎、搜狐新闻、李留白公众号、CSDN「Meta.Qing」博客等网页 什么是Web3.0?1.什么是Web3.0&#xff08;概念介绍&#xff09;&#xff1f;2.Web3.0简单理解3.Web3.0的技术特点4.Web3.0项目1.什么是Web3.0&#xff08;概念…...

[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”文件中&#xff0c;在onInitialize函数中初始化应用。示例代码如下&#xff1a; Override public void onInitialize() {AiLifeServiceHelper.initApplication(this);DeviceHandlerAbility.register(this, "&qu…...

浅析 Makefile

Makefile逻辑 Makefile就是将一系列的工作流串在一起自动执行&#xff0c;构成Makefile最基本的要素是目标、依赖、命令。也就是为了实现目标需要哪些依赖并执行什么样的命令。 target: dependences1 dependences2 ... command1 command2 ...其中&#xff0c;target表示要生…...

保护品牌线上声誉的5种方法

我们如今生活在一个搜索便捷的世界&#xff0c;对于一个企业和个人来说&#xff0c;品牌的线上声誉也尤为重要。在客户考虑与您的公司开展业务之前&#xff0c;他们理所当然会先使用众多软件和平台搜索相关信息&#xff0c;以帮助他们了解和做决定。 因此&#xff0c;您的品牌…...

Java多重选择结构,超详细整理,适合新手入门

目录 一、什么是多重选择结构&#xff1f; 二、if 语句的语法 1、什么是嵌套if语句&#xff1f; 2、if 语句循环基本用法&#xff1a; 3、案例&#xff1a; 二、if...else多重选择结构语法 1、什么是if-else语句&#xff1f; 2、if...else 循环基本用法 3、案例&#…...

SCI写作,一定要避开这些“雷点”!

SCI论文写作中&#xff0c;除了要符合各部分的写作要求&#xff0c;还有许多细节问题需要我们注意&#xff0c;不然可能一不小心就会“踩雷”。 今天我们就来和大家分享SCI各个部分写作时的注意事项。 下面就进入正题&#xff01; SCI写作注意事项 01 标题的拟定 1.避免使用无…...

漫画收藏自由:picacomic-downloader的离线阅读解决方案

漫画收藏自由&#xff1a;picacomic-downloader的离线阅读解决方案 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器&#xff0c;带图形界面 带收藏夹&#xff0c;已打包exe 下载速度飞快 项目地址: https://gitcode.com/gh…...

轻松破解游戏资源加密难题:RPG Maker Decrypter使用指南

轻松破解游戏资源加密难题&#xff1a;RPG Maker Decrypter使用指南 【免费下载链接】RPGMakerDecrypter Tool for extracting RPG Maker XP, VX and VX Ace encrypted archives. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDecrypter 直面游戏资源解密痛点 …...

计算机毕业设计springboot研友帮系统设计与实现 基于SpringBoot的考研互助社区平台开发与实现 SpringBoot框架下研究生学术协作系统的设计与应用

计算机毕业设计springboot研友帮系统设计与实现w2zpm5oh &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着研究生招生规模的持续扩大&#xff0c;考研竞争日益激烈&#xff0…...

ViGEmBus虚拟手柄驱动:Windows系统控制器仿真解决方案与开发者指南

ViGEmBus虚拟手柄驱动&#xff1a;Windows系统控制器仿真解决方案与开发者指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 核心价值解析&#xff1a;重新…...

ChatTTS一键启动:从零搭建语音合成服务的实战指南

语音合成服务在现代应用中扮演着越来越重要的角色。它被广泛应用于智能客服、有声读物生成和视频内容配音等场景。通过将文本转化为自然流畅的语音&#xff0c;极大地提升了人机交互的体验和应用的可访问性。 然而&#xff0c;对于希望快速部署ChatTTS这类先进语音合成模型的开…...

FireRedASR-AED-L从零部署:无需Python环境,Docker镜像开箱即用指南

FireRedASR-AED-L从零部署&#xff1a;无需Python环境&#xff0c;Docker镜像开箱即用指南 你是否遇到过这样的情况&#xff1f;想用最新的语音识别模型&#xff0c;却被复杂的Python环境、版本冲突和依赖安装搞得焦头烂额。或者好不容易装好了环境&#xff0c;又因为音频格式…...

专科ENSP毕设实战:基于eNSP的校园网高可用架构设计与配置避坑指南

最近在帮几个专科的学弟学妹看他们的eNSP毕业设计&#xff0c;发现大家普遍卡在几个地方&#xff1a;拓扑画得挺漂亮&#xff0c;但一配置就各种不通&#xff1b;协议背得滚瓜烂熟&#xff0c;但实际命令敲下去就报错&#xff1b;最后答辩演示时&#xff0c;一拔线整个网络就瘫…...

Wemod-Patcher:开源工具实现WeMod功能增强的完整方案

Wemod-Patcher&#xff1a;开源工具实现WeMod功能增强的完整方案 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 在游戏体验优化领域&#xff0…...

从Autoencoder到VAE:探索生成模型的演进之路

1. 从数据压缩到生成模型&#xff1a;Autoencoder的诞生 2006年&#xff0c;当Geoffrey Hinton团队首次提出Autoencoder&#xff08;自编码器&#xff09;时&#xff0c;这个看似简单的神经网络结构悄然打开了深度学习的新篇章。想象一下你正在整理杂乱的书架——先把书籍按主题…...

RWKV7-1.5B-g1a效果对比:RWKV7-1.5B vs RWKV6-3B在中文摘要任务F1提升11%

RWKV7-1.5B-g1a效果对比&#xff1a;RWKV7-1.5B vs RWKV6-3B在中文摘要任务F1提升11% 1. 模型介绍 rwkv7-1.5B-g1a 是一个基于 RWKV-7 架构的多语言文本生成模型&#xff0c;特别适合处理基础问答、文案续写、简短总结和轻量中文对话任务。相比前代RWKV6-3B模型&#xff0c;它…...