动态链接库(一)--动态链接库简介

写在前面

自从微软推出的第一个版本的Windows操作系统以来,动态链接库(DLL)一直就是Windows操作系统的基础。

动态链接库通常不能直接运行,也不能接收消息。它们一直是独立的文件,其中包含能被可执行程序或其他DLL文件调用来完成某项工作的函数。只有在其他模块调用动态链接库中的函数时,它才能发挥作用。在实际编程时,我们可以把完成某种功能的函数放在一个动态链接库中,提供给其他程序调用。

Windows API中所有的函数都包含在DLL中,其中有3个最重要的DLL:
①Kernel32.dll
它包含用于管理内存、进程和线程的函数,例如CreateThread函数。
②User32.dll
它包含用于执行用户界面任务(如窗口的创建和消息的传递)的函数,例如CreateWindow函数。
③GDI32.dll
它包含用于画图和显示文本的函数

静态库和动态库

静态库

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

动态库

在使用动态库的时候,往往提供两个文件:一个引入库文件和一个DLL(.dll)文件。

注意:
虽然引入库文件的后缀名也是”.lib”,但该文件和静态库的”.lib”文件有着本质上的区别。

静态库的”.lib”文件包含数据和函数的声明实现,而动态库的”.lib”引入库文件则仅包含导出的函数和变量的符号名(声明),而在DLL文件中才包含实际的函数和数据。

在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将DLL映射到进程的地址空间中,然后访问DLL中的导出函数。

这时,在发布产品时,除了发布可执行文件以外,还要发布该程序将要调用的动态链接库(dll)。

动态链接库的优势

①可以采用多种编程语言来编写
我们可以采用自己数据的开发语言编写DLL,然后由其他语言编写的可执行程序来调用这些DLL。

②增强产品的功能
在发布产品时, 可以发布产品功能实现的动态链接库规范, 让使用该动态链接库的开发人员遵循这个规范开发自己的DLL, 以取代产品原有DLL, 让产品调用新的dll, 因此实现增强产品的功能.

③提供二次开发的平台
可以采用DLL的形式提供一个二次开发的平台, 让用户可以利用该DLL中已实现的功能, 封装成自己需要的符合业务需求的DLL, 实现二次开发.

④简化项目管理
在一个大型的项目中, 可以将项目细分, 将不同的功能交由各个项目小组以DLL的形式实现, 以同步协作推进项目.

⑤可以节省磁盘空间和内存
假如多个程序都会用到一个DLL, 那么加载时只会加载一次, 然后和其他进程共享, 以节省内存.

⑥有助于资源的共享
DLL可以包含对话框模板, 字符串, 图标, 位图等资源, 假如多个应用程序会用到同一个对话框模板, 或者图标等, 可以将这些对话框和图标等资源封装到一个DLL中, 以供多个程序使用.

⑦有助于实现应用程序的本地化
如果产品需要提供多种语言版本, 那么可以使用DLL来支持多语言, 可以为每种语言创建一种只支持该语言的DLL.

动态链接库的加载

隐式加载

  1. 可以在项目属性 -> 链接器 -> 附加依赖项 中输入所需动态链接库的引入库文件(.lib文件), 然后将DLL文件放到执行目录下
  2. 也可通过#pragma comment(lib, 引入库文件路径), 来隐式加载, 同时也需要将DLL文件放到执行目录下.

项目属性导入引入库文件

//注意路径, 这里会以当前文件的路径去查找Dll1.lib文件
#pragma comment(lib, "Dll1.lib")

显式加载

显式加载步骤:
①程序目录下要存在dll文件
②通过LoadLibrary函数加载
③通过GetProcAddress获取导出函数地址
④程序中通过获取到的函数指针调用接口
⑤使用完dll后通过FreeLibrary函数释放对dll的引用

小结

这里仅简单的介绍了下动态链接库的相关知识及使用, 后面会详细的介绍如何使用动态链接库, 使用时的注意事项, 如何创建自己的dll或二次开发他人的dll.

  • 29
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值