目录

1 DLL是什么

2 静态链接库和动态链接库

2.1 静态库

2.2 动态库

3 使用动态链接库的好处


1 DLL是什么

DLL 是 Dynamic Link Library 的缩写,译为“动态链接库”。DLL也是一个被编译过的二进制程序,可以被其他程序调用,但与 exe 不同,DLL不能独立运行,必须由其他程序调用载入内存。

DLL 是一个包含可由多个程序同时使用的代码和数据的库。例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。

DLL 中封装了很多函数,只要知道函数的入口地址,就可以被其他程序调用。

Windows API中所有的函数都包含在DLL中,其中有3个最重要的DLL:

  • Kemel32.dll:它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;
  • User32.dll:它包含那些用于执行用户界面任务(如窗口的创建和消息的传送)的函数,例如 CreateWindow 函数;
  • GDI32.dll:它包含那些用于画图和显示文本的函数。

2 静态链接库和动态链接库

2.1 静态库

函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下, 在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

2.2 动态库

在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件和一个DLL (.dll) 文件。虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质上的区别,对一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。这时,在发布产品时,除了发布可执行文件以外,同时还要发布该程序将要调用的动态链接库

3 使用动态链接库的好处

1) 可以采用多种编程语言来编写

我们可以采用自己熟悉的开发语言编写DLL,然后由其他语言编写的可执行程序来调用这些DLL。例如,可以利用VB来编写程序的界面,然后调用利用VC++或Delphi编写的完成程序业务逻辑的DLL。

2) 增强产品的功能

在发布产品时,可以发布产品功能实现的动态链接库规范,让其他公司或个人遵照这个规范开发自己的DLL,以取代产品原有的DLL,让产品调用新的DLL,从而实现功能的增强。在实际工作中,我们看到许多产品都提供了界面插件功能,允许用户动态地更换程序的界面,这就可以通过更换界面DLL来实现。

3) 提供二次开发的平台

在销售产品的同时,可以采用DLL的形式提供一个二次开发的平台,让用户可以利用该DLL调用其中实现的功能,编写符合自己业务需要的产品,从而实现二次开发。

4) 简化项目管理

在一个大型项目开发中,通常都是由多个项目小组同时开发,如果采用串行开发,则效率是非常低的。我们可以将项目细分,将不同功能交由各项目小组以多个DLL的方式实现,这样,各个项目小组就可以同时进行开发了。

5) 可以节省磁盘空间和内存

如果多个应用程序需要访问同样的功能,那么可以将该功能以DLL的形式提供,这样在机器上只需要存在一份该DLL文件就可以了,从而节省了磁盘空间。另外,如果多个应用程序使用同一个DLL,该DLL只需要放入内存一次,所有的应用程序就都可以共亨它了。这样,内存的使用将更加有效。

我们知道,当进程被加载时,系统会为它分配内存,接着分析该可执行模块,找到该程序将要调用哪些DLL,然后系统搜索这些DLL,找到后就加载它们,并为它们分配内存空间。DLL的内存空间只有一份,如果有第二个程序也需要加载该DLL,那么它们共享内存空间,相同的DLL不会再次加载。

6) 有助于资源的共享

DLL可以包含对话框模板、字符串、图标和位图等多种资源,多个应用程序可以使用DLL来共享这些资源。在实际工作中,可以编写一个纯资源的动态链接库,供其他应用程序访问。

7) 有助于实现应用程序的本地化

如果产品需要提供多语言版本,那么就可以使用DLL来支持多语言。可以为每种语言创建一个只支持这种语言的动态链接库。

通过使用 DLL,程序可以模块化为单独的组件。 例如,会计程序可以按模块出售。 如果安装了主程序,则每个模块都可以运行时加载到主程序中。 由于模块是独立的,因此程序的加载时间会更快。 并且仅在请求该功能时加载模块。

此外,更新更易于应用于每个模块,而不会影响程序的其他部分。 例如,你可能有一个工资单计划,并且税率会每年更改。 当这些更改被隔离到 DLL 中时,无需再次构建或安装整个程序,即可应用更新。

以下列表介绍了在操作系统中作为 DLL 实现的一Windows文件:

  • ActiveX控件 (.ocx) 文件

    一个ActiveX示例是一个日历控件,它允许您从日历中选择日期。

  • 控制面板 (.cpl) 文件

    例如,.cpl位于"控制面板"中的项目。 每个项目都是一个专门的 DLL。

  • 设备驱动程序 (.drv) 文件

    设备驱动程序的一个示例是控制打印到打印机的打印机驱动程序。

动态链接库(dll)简介:https://mp-new.csdn.net/mp_blog/creation/editor/117568291

什么是 DLL:https://docs.microsoft.com/zh-CN/troubleshoot/windows-client/deployment/dynamic-link-library

动态链接库 (DLL)相关推荐

  1. C++动态链接库dll及静态链接库lib制作及使用教程

    现需将C++函数封装成动态链接库dll,网上看了好多博客教程,说的都不够全面,现提供一个很有用的视频,亲测有效,启发很大,附上链接: 视频网址 下面自己根据视频记录下制作动态链接库dll过程,防止忘记 ...

  2. VC++动态链接库(DLL)编程(四)――MFC扩展 DLL

    VC++动态链接库(DLL)编程(四) ――MFC扩展 DLL 作者:宋宝华  e-mail:21cnbao@21cn.com   前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细 ...

  3. 教你认识动态链接库DLL文件

    教你认识动态链接库DLL文件   DLL是Dynamic Link Library的缩写,意为动态链接库.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接 ...

  4. VC++动态链接库(DLL)编程(一)――理解库

    VC++动态链接库(DLL)编程(一) ――理解库 作者:宋宝华  e-mail:21cnbao@21cn.com 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概 ...

  5. 动态链接库dll,静态链接库lib, 导入库lib

    目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称"静态库"),另一种为动态连接库(DLL,以下简称"动态库")的导入库(Imp ...

  6. c#(winform)环境下使用动态链接库dll的详解

    c#(winform)环境下使用动态链接库dll的详解 转载 2016年05月14日 10:12:17 3208 1,什么是dll文件? DLL(Dynamic Link Library)文件为动态链 ...

  7. 动态链接库dll,静态链接库lib, 导入库lib 转

    动态链接库dll,静态链接库lib, 导入库lib 在用VS编译工程的时候,我们会选择动态链接库dll,静态链接库lib(static library),可是为什么在编译动态链接库的时候也可以指定输出 ...

  8. Windows 动态链接库DLL浅解

    为什么80%的码农都做不了架构师?>>>    动态链接库(DLL),即:Dynamic Link Library.一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件 ...

  9. DELPHI 7 动态链接库DLL断点调试

     DELPHI 7 动态链接库DLL断点调试           马根峰           (广东联合电子服务股份有限公司, 广州 510300) 作者博客: CSDN博客:http://blog. ...

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

    1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了" ...

最新文章

  1. Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function解决方法
  2. ASP.NET MVC应用程序展示RDLC报表
  3. HyperLedger Fabric 错误记录
  4. LeetCode Algorithm 268. 丢失的数字
  5. 易语言html规则分析,易语言算法原理浅析【一】(示例代码)
  6. linux中echo命令不输出换行,shell脚本echo输出不换行功能增强实例
  7. python上传文件到linux服务器_python上传大文件到服务器报错
  8. jdk、jre及jvm的关系
  9. java的parse方法_Java即时类| parse()方法与示例
  10. sqlserver临时表操作
  11. pytorch笔记-实现一个图像分类模型
  12. 苹果Mac最好用的FTP客户端:Transmit
  13. C#初学者教程系列19:Winform应用程序
  14. 电脑任务栏卡死的解决方法
  15. 计算机系统结构专业都学什么,计算机专业都学些什么?
  16. 2021国开计算机应用基础形考任务答案,2021电大计算机应用基础形考试题答案解析.doc...
  17. 关于C++的数组或者字符串的输入问题
  18. 【踩坑】npm ERR! missing script: serve
  19. 什么是5G,看完这篇文章就足够了!
  20. 以太坊联盟链-多节点私链搭建手册

热门文章

  1. 计算机组装的品牌价格,相同配置的品牌电脑和组装电脑价格相差多少
  2. 【已解决】彻底修改Tomcat9 控制台 中文乱码问题
  3. Spark SQL上海摩拜共享单车数据分析
  4. 对哈夫曼编码的输出 c语言,哈夫曼编码问题
  5. 机器学习——K近邻算法及乳腺癌检测分类
  6. 面试官:抽象工厂模式是什么?
  7. loopback 搭建
  8. Typora 图床教程(阿里云版)
  9. 刷机错误ERROR:STATUS_BROM_CMD__FAIL
  10. 门店销售管理系统助力传统门店信息化升级