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文件啥用,又摆脱大菜一小步了。哈哈