关于动态链接库的笔记

1.动态链接库是应用程序的一个模块,这个模块用于导出一些函数和数据供程序中的其他模块使用,包括三个方面:

  •  动态链接库是应用程序的一部分,在本质上与可执行文件没有区别,都是作为模块被进程加载到自己的地址空间的。
  •  动态链接库在程序编译时并不会被插入到可执行文件中,在程序运行时整个库的代码会调入内存
  • 在物理内存中只有一份库的代码,仅通过分页机制将这部分代码映射到不同的进程中

(PS:跟Python的模块是不是一个概念呢?)

2.动态链接库的入口函数是DllMain,仅供操作系统使用,三个参数分别为:

  •     HANDLE hModule                 // 本模块句柄
  •     DWORD ul_reason_for_call  // 调用的原因
  •     LPVOID lpReserved              //没有被使用

3. ul_reason_for_call有四种情况:

  •     DLL_PROCESS_ATTACH   表示动态库被某个进程加载,程序可以在这里做一些初始化工作
  •     DLL_PROCESS_DETACH  表示动态库被卸载,程序在这里进行一些资源的释放工作
  •     DLL_THREAD_ATTACH 表示应用程序创建了一个新的线程
  •     DLL_TEREAD_DETACH 表示某个线程正常终止

4.DLL能够定义两种函数,导出函数和内部函数,导出函数可以被其他模块调用,也可以被定义这个函数的模块调用,而内部函数只能被定义这个函数的模块调用。

5.函数定义完成后只能在本工程中使用,要想将函数导出供其他模块调用,最简单的方法是在.h文件中进行声明:

   __DECLSPEC(dllexport) void ExportFunc(LPCTSTR pszContent);

6.编译链接程序后,最后工程产生的文件中有三个文件可以被其他工程使用:.H头文件、.dll文件和.lib文件,其中.h文件包含了导出函数的声明,.dll文件就是动态链接库,.lib文件是供程序开发使用的导入库。

7.调用DLL中的导出函数有两种方法:

  • 装载期间动态链接:必须使用.lib文件,她为系统提供了加载这个DLL和定位DLL中的导出函数所需的信息。#pragma命令指明要链接到.lib库,载入器加载DLL文件时,.DLL文件必须跟.exe文件放在同一目录下才能运行。默认情况下是在程序的当前目录下查找,如果找不到就会到系统盘的system32文件中查找,装载期间动态链接家宅DLL库的缺点很明显,如果用户丢失了DLL文件,那么程序永远不能启动。
  • 运行期间动态链接:使用LoadLibrary加载DLL,使用GetProcAddress函数取得DLL导出函数的地址,只用到.DLL文件,不用.h和.lib文件。在工程中建立一个DEF文件来指定要导出的函数,在DEF文件中写:EXPORTS 导出函数名。

大致就是上面这些了,以前一直不明白.dll文件和.lib文件啥用,又摆脱大菜一小步了。哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值