孙鑫关于DLL(Dynamic Link Library)动态链接库的视频讲座笔记和学习小结

Dynamic-Link库 (动态链接库) 动态链接库调用 阅读详情

孙鑫关于DLL(Dynamic Link Library)动态链接库的视频讲座笔记和学习小结

听课时间:2009年9月20日

整理日期:2009年9月21日

一、使用DLL的优点

①、多种语言编写(Visual Studio 6.0,Delphi 2008等)

代码提供者可以选择自己熟悉的语言开发DLL功能封装模块

项目工程可以由熟练掌握不同开发环境的工程师参与进来

②、有利于增强产品的功能

功能可以被快速扩展实现,类似于面向对象中的类和派生类的关系

产品可以单独发布像皮肤插件、音效插件等一些日新月异的功能需求

③、为市场提供二次开发平台,有利于产品的推广和应用

用户可以根据自己的产品规划,基于其他功能提供商的DLL,开发新的创新型产品

如,国际OPC基金会提供了opc_aeps.dll、opccomn_ps.dll、opchda_ps.dll、OPCProxy.dll等OPC接口规范的相关DLL通用文件,其会员单位又基于这些SDK二次开发出OPCClient.dll、OPCServer.dll等商用DLL,一些对OPC接口存在需求的个人或公司无偿或有偿获得二次开发出的DLL,嵌入到自己的产品中,从而为终端用户提供利益服务。

      英国Datapath公司、国内惠州天敏公司、厦门四信公司等,他们的主要产品是硬件,但他们都提供了自己产品的二次开发库,用户可以利用简捷、快速的动态库封装接口,开发出自己的特有产品,不用花费精力去研究自己不熟悉的相关硬件业务处理,大大提升了产品的研发周期。

④、降低编译的复杂性,有利于单元测试,简化了项目管理

DLL单独编译不参与所属工程的编译,大大提升了编译效率,简化了工程工作区的规模,利于软件开发者集中精力解决当前任务。

⑤、节省磁盘空间和内存

      虽然当前计算机技术突发猛进,但作为一名软件开发人都应该时刻保持一种为用户节约资源、提高单位工作效率为目标。一个DLL在内存中仅保存一份实例,提高了系统的内存利用率。

⑥、有助于资源共享

      面对软件技术的不断成熟,软件开发从业者的不断积累,我们应该建立自己的代码库,将通用的、常用的功能封装起来,简化自己的开发工作,努力让自己的DLL被他人所认可和接受。

⑦、用助于实现产品的国际化

可以封装和调用不同的语言包

二、DLL简述

DLL是一种二进制磁盘文件(通常带有.dll扩展名),它由全局数据、导出函数、类和资源组成。

Windows系统中非常重要的DLL有:Kernel32.dll管理内存、进程和线程的各个函数;User32.dll执行用户界面任务的各个函数;GDI32.dll画图和显示的各个函数。

在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分,如果与其它DLL没有冲突,一般映射到进程虚拟空间的同一地址上。

图一

每个Win32进程都有4G虚拟内存空间,进程不能访问上端2G和下端2G中的64K隔离区,隔离区的目的:防止进程非法访问非授权区域,增强进程的健壮性和安全性。

EXE一般被加载到内存中的地址为:0X40000000,DLL一般被加载到内存中的地址为:0X10000000,多个DLL依次分配。

2.2、静态链接库与动态链接库

静态库:函数和数据被编译成一个二进制文件(.LIB),与EXE一起编译产生执行文件,库中的函数和数据被复制到执行文件中

动态库:由一个引入库(.LIB)和一个DLL文件组成。引入库中包含DLL导出函数和变量的符号名,DLL包含实际的实现代码和数据。编译执行文件时,只需引入库即可。

三、dumpbin 应用简述

运行cmd命令,可能提示如下:

图二

你可到Visual Studio 的安装目录下

C:/Program Files/Microsoft Visual Studio/VC98/Bin

中找到 VCVARS32.BAT 将其拖动到命令窗口中,

图三

接着你就可以尽情调用 dumpbin 调试DLL了

-exports 导出信息

-imports 导入信息

四、Depends应用简述

开始 — 程序 — Microsoft Visual Studio 6.0 —

Microsoft Visual Studio 6.0 Tools — Depends

图四

?原因:主要系在OPCDCCManager.exe的所在目录中没有找到调用库文件

五、代码编写时的注意事项

①、_declspec(dllimport) 效率比 extern 声明效率更高,建议使用前者,前者明确告诉编译器定义是来自于一个LIB输入库文件

②、DLL头文件中的条件编译指令

#if defined DLL_EXPORT

#define CFGMODULE_API __declspec(dllexport)

#else

#define CFGMODULE_API __declspec(dllimport)

#endif

上述条件编译指令, DLL调用方可以使用,DLL自己也可以使用;此时需要在DLL的.cpp文件中,定义 #define DLL_EXPORT 宏,之后包含 #include DLL的导出信息头文件;

对于一个工程来说,头文件不参与编译,.cpp文件单独编译。

③、导出C++类

class DLL_EXPORT Point  //导出整个类

{

public:

      void output();

}

④、获取调用DLL方的窗口句柄

GetForegroundWindow

HWND hwnd = GetForegroundWindow();

HDC hdc = GetDC(hwnd);

//……

ReleaseDC(hwnd, hdc);

⑤、名字改编引起的问题

编译器不同,名字改编的规则是不同的;为解决C++和C之间的库函数调用,我们可以使用extern "C" ,它的缺点是:不能导出类的成员函数

模块定义文件 .def 用来解决名字改编问题

新建一个.txt文件,把它的名字强制改为 .def文件

在工作区中,选择菜单 Project — Add To Project — Files,添加上述创建的.def文件,在该文件中定义导出函数

LIBRARY DLLNAME 该名字要和DLL的发布名字一致

EXPORTS

add

subtract

⑥、标准调用约定 _stdcall ,C调用约定 _cdecl及_fastcall调用约定

_stdcall其实就是WinAPI、Pasical调用约定

dumpbin –exports 时看到的函数名:_add@8,其中的8代表函数的参数字节数,即:_functionname@number.

函数的参数自右向左入栈,被调用函数返回前负责清理传送参数的内存栈。

C调用约定 _cdecl

参数传递与_stdcall一致,但C调用约定规定用于参数传递的内存栈由调用者负责维护(也正因为如此,实现可变参数的函数只能使用该约定)。另外在函数名的修饰方面也有所不同,即_functionname。

_fastcall调用约定主要特点就是速度快,它通过寄存器传递参数(实际上,它用ECX和EDX传送前两个双字或更小的参数,剩下的参数仍旧自右至左入栈传递,被调用的函数在返回时负责清理传送参数时的内存栈)。在函数名的修饰方面也是独树一帜,即:@functionname@number。

名字改编均不改变函数名的大小写。

⑦、DLLMain

创建DLL的一个可选项,在这个函数中不要执行太复杂的应用,因为此时系统的一些核心DLL可能还未被加载。

⑧、应用程序少一个DLL都无法继续运行,LIB起到程序定位表的作用

⑨、MFC扩展DLL只能被MFC应用程序所使用

六、隐式链接和显示链接

通过引入库(LIB)隐式

#include "" //

#pragma comment(lib, "");

应用程序编译时将LIB引入库中的信息引入执行文件中,运行时通过引入库访问DLL的导出函数

Windows搜索应用程序需要的DLL的顺序为:

①、包含应用程序EXE文件的目录

②、进程的当前目录

③、Windows系统目录

④、Windows目录

⑤、列在Path环境变量中的一系列目录

如果隐式链接的DLL过多,会严重影响应用程序的启动时间。

显式

LoadLibrary、GetProcAddress、FreeLibrary

      用户决定DLL的加载时机。GetProcAddress 中可以使用,MAKEINTERSOURCE(),参数为函数的顺序号,这样调用DLL函数的速度会很快。

 

 

C++动态链接库(DLL)的创建和调用(VS2019) 动态链接库(Dynamic Link Library,DLL)是一个包含可由多个程序同时使用的代码和数据的库。通俗来讲,它就是一个仓库,提供一些可以直接拿来用的变量、函数或者类。 阅读详情

相关推荐

动态链接库dynamic link library

VC++2008制作。 展示动态链接库的制作和使用!! 动态链接库深入浅出!! 定义出口函数和入口函数!!

C++ 动态链接库(Dynamic Link Library)

介绍 VSCode 以及 Visual Studio 2022 编译生成并调用验证动态链接库的方法。

weixin_50626562的博客 1841

多旋翼飞行器设计与控制·Pixhawk4以及外部设备接线(笔记004)

笔记主要来源:Pixhawk 4 接线快速入门 目录 一、Pixhawk 4 的各个接口 二、接线图概览(重要传感器及外围设备) 三、飞控、GPS的安装和方向 四、电源 五、无线电遥控 六、数传电台(可选) 七、SD Card(可选) 八、电机以及其他外设 一、Pixhawk 4 的各个接口 FMU:Flight Management Unit 飞行管理组件 主 FMU 处理器:STM32F765 32 位 Arm® Cortex®-M7,216MHz,2MB...

猪猪的博客 1万+

VC++动态链接库(DLL)编程深入浅出(zz)

1.概论  先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。  静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必...

weixin_33755554的博客 641

详解TCP/IP五层模型

TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。

2201_75437633的博客 1万+

原恒星尘埃生长的三维MHD模拟与湍流效应研究

星际尘埃演化是恒星形成过程中的关键环节,其动力学行为直接影响行星系统的构建。通过磁流体力学(MHD)模拟可以揭示尘埃颗粒从微米级到行星胚胎尺度的生长机制,其中湍流效应通过改变碰撞频率和密度结构发挥双重作用。最新研究采用COALA-RAMSES耦合框架,实现了包含自洽尘埃生长的三维非理想MHD模拟,量化了不同物理环境下尘埃尺寸分布的演化规律。这些发现不仅为解释ALMA观测数据提供理论依据,也对行星形成初期条件约束具有重要意义,特别是在湍流参数化与尘埃生长速率关系方面取得突破。

weixin_30988079的博客 382

【动态连接库和静态链接库的介绍】

GCC编译器:GCC是Linux系统中最常用的C/C++编译器,它的实现是以静态链接库的形式提供的。- ALSA音频驱动:ALSA是Linux系统中最常用的音频驱动框架,它的实现是以静态链接库的形式提供的。在Linux系统中,OpenGL的实现是以动态链接库的形式提供的,应用程序可以通过加载OpenGL动态链接库来使用OpenGL的功能。- GTK+图形界面库:GTK+是一个跨平台的图形界面开发框架,它的实现是以静态链接库的形式提供的。例如,printf函数就是通过调用glibc中的输出函数来实现的。

zero2100的专栏 1745

基于大模型的围术期谵妄防控系统研究报告

围术期谵妄是一种急性脑功能障碍综合征,通常发生在手术前后一段时间内。患者会出现意识障碍、注意力不集中、认知功能紊乱、睡眠 - 觉醒周期失调等症状,严重者甚至会出现幻觉、妄想和攻击行为 。这种病症不仅会给患者自身带来极大的痛苦,还会对其术后康复产生严重的负面影响。从患者角度来看,围术期谵妄会显著延长患者的住院时间,增加患者的医疗费用负担。有研究表明,发生谵妄的患者住院时间平均比未发生者延长 2 - 3 天。长时间的住院不仅会影响患者的生活质量,还可能导致患者错过最佳的康复时机,影响身体机能的恢复。同时,谵妄还

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1071

动态链接库(Dynamic Link Libraries)

 动态链接库(Dynamic Link Libraries)作者:Acharlix 动态链接库(Dynamic Link Libraries)的缩写是DLL,大部分动态链接库镜像文件的扩展名为DLL,但扩展名为其它的文件也有可能使动态链接库,如系统中的某些EXE文件、各种控件(*.OCX)等都是动态链接库。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,

Ackarlix的专栏 2683

Docker部署Nextcloud私有云:MariaDB、OnlyOffice与HTTPS全栈实践

Nextcloud作为主流开源私有云平台,其稳定部署依赖Docker容器化、MariaDB数据库优化、OnlyOffice在线协作集成及HTTPS安全加固四大核心技术。理解Docker Compose服务健康检查机制与依赖等待原理,可避免因启动时序导致的500/404错误;掌握MariaDB字符集配置与InnoDB参数调优,是保障Nextcloud全文搜索与大文件上传可靠性的底层基础;而OnlyOffice的JWT兼容性控制与Nginx路径重写规则,则直接决定文档协同功能是否可用。在家庭NAS、边缘服务器或

weixin_30328063的博客 514

使用 Simulink Real-Time 搭建一个完整的实时信号采集与滤波系统模型

本文详细介绍了基于Simulink Real-Time构建实时信号采集与滤波系统的完整流程。主要内容包括:系统配置(模型创建与参数设置)、信号采集模块搭建(模拟信号源或真实硬件连接)、实时滤波器设计(浮点/定点)、输出可视化(Scope/ToWorkspace等)、模型编译与下载到目标机、外部模式在线调试及数据保存方法。系统可实现微秒级实时信号处理,适用于工业控制、航空航天等对时间确定性要求高的场景。文章还提供了优化建议(多速率建模、优先级调度等)和应用场景说明,帮助读者快速掌握实时系统开发的核心技能。

amy_mhd的博客 304

动静态库(编译的基本原理)

编译器会识别源代码中的符号定义,如变量的声明、函数的定义等,并提取出符号的名称、类型、作用域等信息。

weixin_74128452的博客 1416

科研——BIBM论文修改和提交

BIBM的相关操作流程汇总

Blackoutdragon的博客 6688

动态链接库(Dynamic Link Library)学习笔记

动态链接库(Dynamic Link Library)学习笔记作者:yxin1322 blog:http://blog.youkuaiyun.com/yxin1322  转载请注明出处         我对动态链接和动态链接库的概念并不陌,但一直以来就停留在概念的层面上,没有更深入的了解。今天抽空看了一下有关动态链接和动态链接库的文章,有了一些新的认识,当然不能忘了

小有的专栏 1万+

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力 (论文笔记+引入代码)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 2864

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Windows---动态链接库Dynamic Link Library(.dll)

DLL通过动态链接机制为应用程序提供共享功能支持。本文从DLL的定义、发展历史和文件结构三方面展开分析: 本质与价值:DLL是包含可执行代码和数据的二进制文件,通过运行时加载实现代码复用、资源节省和模块化开发,与EXE文件在功能定位和执行方式上有本质区别。 演进历程:从DOS时代的静态链接困境,到Windows 95引入成熟的DLL机制,再到.NET框架下的托管DLL,DLL技术不断演进,已成为Windows生态的核心支柱。

MzKyle的博客 2370

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

动态链接库(DLL是什么?):深入解析与常见问题研究

DLL 是一种模块化二进制文件,用于封装可供多个应用共享的功能模块。其主要目标在于实现代码复用与动态加载。通常,DLL 文件的扩展名为.dll,但某些变种如.ocx(ActiveX 控件)和.drv(驱动程序)也遵循相同的动态链接机制。它允许开发者将重复功能提取到单独的模块中,降低维护成本,并提升项目的整体可扩展性。动态链接库是 Windows 平台上实现模块化设计和资源共享的核心工具。尽管其带来了显著的开发便利性和性能提升,但也因复杂的依赖关系和加载机制引发了诸多问题。

开源AI 专属 UI——papyrai-ui。《千界明彻录》(故事形式构建元思维)——胡说小说。更多思辨内容在公众号。 6747

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Dynamic-link library

动态链接库基本概念Dynamic-link library (or DLL) is Microsoft’s implementation of the shared library concept in the Microsoft Windows and OS/2 operating systems. These libraries usually have the file extension D

wang010366的专栏 2605

DLL编写(VC,孙鑫MFC教程笔记)

(1)如果查看一个程序的输入信息:     ​dumpbin -import XX.exe (2)动态链接库,会产生三个文件:XX.lib XX.exp XX.dll     ​XX.lib——记录了dll文件里面有的函数信息,在编译连接的时候用上。实际内容不在里面,也就是可以说:只是记录了函数的名称,实体在dll文件里面。     ​XX.exp——数据交换文件,

hao18的专栏 1071

孙鑫 第十九课 动态链接库DLL

关于DLL的调用方式有两种①静态调用方式 在制作DLL时使用_declspec(dllexport)声明函数为导出函数,编译成功后会在Debug下生成.dll 和 .lib文件,其中.lib文件存储的是DLL中函数的符号信息。 .dll文件中存储的是函数的具体实现。静态调用方式下只需要在.exe引入.lib文件,而.dll文件要在程序可以搜索到的路径下。 eg.//制作Dll,Dll.cpp_de

cuihao0532的博客 669

Dynamic Link Library

DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。 使用动态连接库的一些好处是:         1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。         2.在钩子程序过滤系统消息时必须使用动态连接库。         3.动态连接库以一种自然的方式将一个大的应用程序划

WangZuoyu的技术专栏 968

我的Dll(动态链接库)学习笔记

DLL(Dynamic Link Libraries)专题:    比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时

rivershan的专栏 7610

Lib和DLL调用与实现

DLL:Dynamic Link Library 动态链接库 是一个被其他应用程序调用的程序模块,其中封装了可以被调用的资源或函数。DLL 文件属于可执行文件,它符合Windows系统的PE文件格式,不过它是依附于EXE文件创建的的进程来执行的,不能单独运行。 现实步骤: IDE新建工程DLLTest1,选择空项目,创建完毕 右击项目 -> 属性 -> 常规 -> 配置类型 选择 动态库.dll 添加头文件Calc.h (例子测试)在头文件中添加导出函数add函数 #pragma on

weixin_45239587的博客 1077

Windows平台下的动态链接库(DLL)

Windows平台下的动态链接库(DLL) 动态链接库DLL(Dynamic Link Library)文件又称"应用程序拓展",是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。...

smallerxuan的博客 1万+

DLL(Dynamic Link Libraries)专题

[ 原创文档 本文适合初级读者 已阅读13080次 ] DLL(Dynamic Link Libraries)专题 作者:姜山 原文出处:http://www.microsoft.com

P2P 研究 思考 2014

55_动态链接库,还在傻傻分不清楚?

程序中用到的Windows API函数都包含在动态链接库(Dynamic Link Library,DLL)中,其中3个最重要的动态链接库(DLL)分别是Kernel32.dll -User32.dIl和Gdi32.dll oKernel32.dll中包含的函数用来管理内存、进程以及线程等,User32.dll中包含的函数用来执行与用户界面相关的任务,例如创建窗口和发送消息等,Gdi32.dIl中包含的酗数用来绘制图像和显示文字等。

成长需要沉淀。 1394
上一篇: 学习 VS6.0 Win32 Application 创建服务程序解决实际项目问题之:SERVICE_STATUS
下一篇: C/C++招聘的一些感受和经验
PerfectToday
博客等级 码龄18年 46粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值