Kernel32.dll 管理内存、进程以及线程相关的API函数
User32.dll 执行与用户界面相关任务的API函数
GDI32.dll 绘制图像和显示文字相关的API函数
为什么要用DLL?
扩展了应用程序的特性
简化了项目管理
有助于节省内存
促进了资源共享
促进本地化
有助于解决平台差异
用于特殊目的
DLL和进程的地址空间
通过指定/DLL开关区分程序是Dll还是应用程序
调用Dll中的函数之前,需要将dll文件映射到进程的地址空间(隐式或者显式)
Dll不会拥有任何对象,调用线程或进程所拥有
一个地址空间=一个可执行模块+多个dll模块
纵观全局
隐式链接:头文件+dll+lib
构建DLL模块
导出变量:尽量避免,难维护
导出函数:多数情况
导出类:导出和导入模块使用的编译器是同一家厂商时,才可以
使用DumpBin.exe工具(加上-exports开关)可以查看dll的导出段
DUMPBIN –exports Kernel32.dll
为非VC++工具包创建dll
混合使用C和C++时,要使用extern “C”避免名称改编
纯C开发时,使用__stdcall调用约定,Microsoft也会对名称改编,解决办法:
使用def文件(推荐)
#pragma comment (linker, “/exports:MyFunc=_MyFunc@8”) 添加在dll源文件
构建可执行模块
加载程序要载入所有相关的dll模块,并用所有导出符号的正确地址来修复每个模块的导入段,为了减少加载时初始化时间,我们应该对可执行模块和dll模块进行基地址重定位和绑定