VS2017 DLL动态库使用教程【二】DLL加载与卸载

Visual Studio2017动态库DLL制作与使用 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件... 阅读详情

DLL的加载

DLL不能独立运行,他只有被*.exe加载才会被运行。

多个进程可以同时调用一个DLL。

数据段与代码段

 

在DLL文件里,至少分为两个段(Section):

Code Section:代码段,存储指令(函数体)

 

Code Section:数据段,存放全局变量

 

当*.dll被加载时,代码段之被加载一次,是公共的。

数据段被每个程序各自拷贝一份,是私有的。

 

做一个演示,为大家展示代码段和数据段的效果,下边为DLL的代码

#include <stdint.h>
#include <stdlib.h>

static int a = 0; //全局变量a

_declspec(dllexport) void SetA(int var) //设置全局变量a的值
{
	a = var;
}

_declspec(dllexport) int GetA() //得到全局变量A的值
{
	return a;
}

下边为DLL APP代码,即是使用这个DLL文件的代码

#include <iostream>
#include <Windows.h>
//声明库
#pragma comment(lib,"DLL_1.lib")
_declspec(dllexport) void SetA(int var); //设置全局变量a的值
_declspec(dllexport) int GetA(); //得到全局变量A的值
int main()
{
	printf("DLL内全局变量a的默认值:%d\n", GetA());
	SetA(100);
	printf("设全局变量a为100后的值:%d\n", GetA());
	system("pause");
	return 0;
}

我们两次运行这个DLLAPP,发现并没有因为第一次设定a为100,第二次就初始就为100。

这正是前文提到的,数据段与代码端结构,不懂请重新阅读头部内容。

 

其他注意事项

*.dll文件被加载后,该文件处于被占用状态,不能修改删除,直到他被卸载。

所有使用他的进程都退出后,该dll被卸载。

 

笔记中代码均保存到我的网盘下,链接:https://share.weiyun.com/5HMq3Cc

查看开源操作系统ReactOS源码,解决dll库动态库加载失败问题(调用LoadLibrary加载失败) 调用LoadLibraryEx接口,解决dll库动态库加载失败问题。 阅读详情

相关推荐

VC++动态库DLL与静态库LIB编程

a.静态库lib的代码在编译时会直接塞到EXE中,EXE可以在用户端直接执行而不需要lib库的支持。因此,打包时不用给客户lib代码了,但EXE可执行文件体积会很大。注意:静态库中不能包含其他的静态库或动态库。b.动态库何时加载和卸载取决于EXE中的指令,调用API动态完成dll库的支持。EXE可执行文件体积会很小,但发布时需要打包dll文件,一起上传才可以执行EXE全部功能。

LZL2020LZL的博客 925

vs2017 中简单创建 dll 和 显示引用dll文件

参考 :在C++中调用DLL中的函数(3) VS2017动态链接库(.dll)的生成与使用 VS2017——C语言dll编译并调用 #import ,#pragma comment ,LoadLibrary”三种引入dll的方式都分别在什么时候使用? VS自带工具:dumpbin的使用前提:因为需求,要用到dll,之前有段时间要用,但一直卡在缺少其它dll问题的困惑中(其实是dll没放入),

zbbzb的博客 1万+

VS2017运行库所需dll

为了让VS2017编译的程序在无任何编译环境的windows系统运行。

VS2017搭建动态链接库dll项目实例

动态链接库的简介和使用Visual Stdio搭建dll工程的实例

x2528238270的博客 1336

vs2017封装和引入动态链接库的源码

在VS2017环境下,开始写自己的第一个DLL(动态链接库)

STM32驱动AD7779:双极性电源下8通道同步ADC的SPI配置与数据采集实战

本文详细介绍了在双极性电源供电下,使用STM32通过SPI接口驱动AD7779同步ADC芯片实现8通道高精度数据采集的实战经验。重点解析了电源设计、抗干扰处理、寄存器配置、SPI通信技巧及数据校准方法,帮助工程师解决工业测量中的同步采样与噪声控制难题。

e3f4g5的博客 370

VS2017 如何引入依赖库(图文教程:libwebsocket为例)

Visual Studio如何引入动态库,具体的步骤

bigger_belief的博客 4975

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南

本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。

weixin_42546392的博客 548

VS2017动态链接库(.dll)的生成与使用

大部分参考:https://blog.youkuaiyun.com/m0_37170593/article/details/76445972 记录中间遇到的问题 生成dll解决方案的时候报错 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "void __cdecl AddAnAdd(int,int (__cdecl*)(int,int))" (?AddAnAdd@@YAXHP6AHHH@Z@Z),该符号在函数 _main 中被引用 DLLTest D:\vs\DLLTest

weixin_41528941的博客 7034

uniapp(全端兼容) - 最新详细uniapp全平台植入使用echarts图表插件,引入 Echarts 图表及使用详细教程,提供各种图表使用示例(拒绝复杂的过程,附带详细的使用示例保姆级教程)

uniapp 微信小程序 echats 图表,uni-app小程序引用echarts,niapp 微信小程序引入echats教程,uniapp 使用echats图表,uniapp开发如何在微信小程序平台使用echats图表,uniapp开发的小程序中怎么用echats,在uni-app中编译到微信小程序如何使用echarts,UNIAPP微信小程序使用Echarts,uni-app微信小程序使用echarts,Uniapp小程序端使用echarts最详细的教程,uni-app中使用Echarts绘画图表,u

✅ 精选推荐文章 1万+

29、高速低功耗采样保持放大器设计

本文详细介绍了适用于低功耗模数转换器的高速低电压采样保持放大器(SHA)的设计技术,包括传统SHA的局限性、采样技术分类以及全NPN型和BiCMOS型SHA的具体设计实现。同时,文章深入探讨了优化输入电容、采样开关驱动及低功耗设计等具体措施,并提供了10位ADC前端和无线通信应用中的实例分析,为相关领域的工程师提供有价值的参考。

weixin_30600615的博客 425

加载动态库的两种方式(win)

Windows环境下动态库的加载有两种方式,记录如下。 环境:vs 1.加载动态库的两种方式 隐式加载 显式加载 2.隐式加载 隐式加载在程序开始执行时将dll文件加载到内存中。这种加载方式需要:.h文件,.dll文件,.lib文件。 在vs的项目属性->链接器的附加库目录设置为存放.lib文件的路径,附加依赖项加入用到的.lib文件名字。将.dll文件和项目生成的.exe文件放...

zhexue13 5828

Python控制TEMI1000/TEMI1500测试温箱

该温箱是我司从昆山振弘检测设备有限公司采购的TEMI 1000,但是控制器用的是韩国的,关于控温箱这个项目,可参考的资料仅有一份官方的manual,里面包含一些命令格式。只要你有温箱,就应该可以向厂家索取该文档。该温箱的通讯接口只有一个RS232接口,要想实现远程控制,需要有串口转USB的线;类似于下图所以,想依靠python来与之进行通信,还是要通过python 的pyserial库,关于怎么安装pyserial,过于简单,这里不做赘述,可自行百度。

xgh1951的博客 1万+

VS2017 DLL动态库使用教程【六】动态加载DLL

什么是动态加载? 之前我们都是用的是自动加载,他是在exe运行启动时,就加载dll。 动态加载,在编译的时候不指定dll,根据代码需要时调用LoadLibrary来加载dll。 而且动态加载可以根据程序需时卸载dll,自动加载只能程序结束卸载dll。 动态加载也叫手工加载。   如何使用动态加载? 首先我们对之前的dll文件做一个小改动,因为动态加载无需声明头文件(*.h),所以所以...

nullccc的博客 9789

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2796

Python基础语法与最佳实践【python基础篇】

本文全面介绍了Python基础语法与最佳实践,涵盖变量与数据类型、控制流、函数、模块与包等核心概念。通过实际代码示例展示了条件语句、循环结构、函数定义及模块导入的基本用法。在最佳实践部分,重点讲解了PEP 8代码风格规范、异常处理技巧、列表推导式、上下文管理器、文档字符串编写以及enumerate和zip的高效使用。这些内容既适合Python初学者掌握基础语法,也能帮助有经验的开发者编写更规范、高效、可维护的代码。文章强调遵循Python官方推荐实践,通过合理运用语言特性提升代码质量。

博客 1977

手把手教你在VS中使用C++动态库(.dll)

静态库(Static Library)是一个包含目标代码(.obj文件)的集合,这些代码在​​编译链接期​​被直接整合(嵌入)到最终的可执行文件(.exe)中。扩展名Windows:.lib.a工作原理当你编译程序时,链接器(Linker)会找到所有你调用的静态库中的函数和变量。它将所需的目标代码从静态库中​​复制​​到你的最终可执行文件中。完成后,你的可执行文件变得​​自包含​​,不再需要在运行时依赖原始的库文件。优点部署简单​​:可执行文件是独立的,分发时不需要额外打包库文件。

weixin_60383827的博客 1447

Android系统开机时间分析与优化指南

本文系统阐述了Android开机时间优化的全流程技术方案。首先详细解析了从电源键按下到桌面显示的完整启动流程及关键事件序列,然后介绍了秒表计时、日志分析和自动化脚本三种测量方法。重点从底层和上层两个维度提出了具体优化措施:底层包括编译器优化、内核驱动裁剪和日志精简;上层涵盖系统服务参数调整、应用预优化和功能组件精简。最后提供了验证工具和方法,并强调优化需要在性能、功耗和功能间取得平衡。通过这套系统化方案,可有效提升Android设备的开机速度与用户体验。

学无止境 355

VS2017创建DLL动态链接库,并隐式与显式调用

VS2017创建DLL动态链接库,并隐式与显示调用 文章目录VS2017创建DLL动态链接库,并隐式与显示调用一、DLL基础知识二、VS2017生成dll1.新建空白项目,新建.h头文件MyDLL.h2.编写对应的c++文件MyDLL.cpp3.修改配置,将默认生成exe改成生成dll三、 隐式调用dll文件1 新创建空白项目,将上一步生成的.lib,.dll以及MyDLL.h均拷贝到当前项目文件夹下2.编写代码,隐式调用dll 不要忘记#include "MyDLL.h"头文件3、显式调用dll 一、D

qq_42190158的博客 2297

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

静态库(lib)和动态库(dll)的使用

静态库(lib)和动态库(dll)的理解与使用前言一、函数重载的理解二、extern “C” 的理解三、静态库的调用1.静态库的生成2.静态库的调用四、动态库的调用1.动态库的生成2.动态库的调用 前言 说明   静态库和动态库在windows软件开发当中很常用,好的软件架构很多功能都是以库的形式存在,假如该功能需要升级,则直接替换该库文件就行,不需要把整个程序进行升级。这样维护起来就比较方便。   常见的库文件有.lib和.dll两种形式,分别是静态库和动态库。   静态库在形成exe文..

张一西的博客 8329

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

windows平台下静态库(.lib)和动态库(.dll)使用

windows下静态库(lib)和动态库(dll)的区别,以及在VS中如何配置静态库与动态库

qq_44778436的博客 5994

VS DLL延迟加载技术

转载:VS之DLL延迟载入_Starr-优快云博客 重点: 1.延迟加载主要两个函数 查看是否被加载:GetModuleHandle(L"Mydll.dll") 手动卸载函数:__FUnloadDelayLoadedDLL2("Mydll.dll"); 延迟加载优点: 延迟加载机制是为了提高进程加载效率的技术,在dll第一次被调用的时候才加载。 延迟加载机制没有对dll任何特殊要求,也就是说任意的一个DLL都可以被延迟加载(除了kernel32.dll)。 MainFile依赖于M..

qq_38409301的博客 1022

Windows中LoadLibrary加载动态库失败,详细解释(解决思路)

GetProcAddress 函数加载由参数 LibFileName 指定的 DLL 文件。参数 LibFileName 指定了要装载的 DLL 文件名,如果 LibFileName 没有包含一个路径,系统将按照:当前目录、Windows 目录、Windows 系统目录、包含当前任务可执行文件的目录、列在 PATH 环境变量中的目录等顺序查找文件。如果函数操作成功,将返回装载 DLL 库模块的实例句柄,否则,将返回一个错误代码,错误代码的定义如引文[1]所示。GetProcAddress 函数。

m0_65635427的博客 7739

动态库的入口——VCRT(DLL)和CRT(SO)

为了更加深入的理解动态库的加载初始化过程,本文根据VCRT和Linux-CRT的代码实现详细描述了windows和linux平台下对应动态库加载时会进行哪些工作。本文重点关注全局变量的初始化时机,以及是否有其他额外的操作。

梦的灰色边沿... 1657

QLibrary 灵活加载动态库

在软件开发中,我们常会遇到这样的需求:希望在不重新编译主程序的情况下扩展功能,或者需要根据运行环境动态加载不同模块。这正是动态库(Dynamic Link Library, DLL / Shared Object, SO)大显身手的场景。qCritical() << "加载失败:""动态库加载失败");静态加载:程序启动时自动加载,占用内存多。// 原始方式(存在类型不安全风险)动态加载:运行时按需加载,节省资源。// 现代C++(编译期类型检查)// 使用类型安全的函数指针转换。

@ 1125

windows系统编程 - 静态库和动态库

介绍了静态库和动态库 显示链接、静态链接的使用,Def导出、DLLMAIN函数,以及DLL劫持

weixin_58038441的博客 1582
上一篇: VS2017 DLL动静态库使用教程【一】创建一个DLL
下一篇: VS2017 DLL动态库使用教程【三】动态内存管理
崔佳宇_
崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄10年 1万+粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值