【Windows核心编程笔记】第十九章 DLL基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhao3132453/article/details/91489215

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模块进行基地址重定位和绑定

猜你喜欢

转载自blog.csdn.net/zhao3132453/article/details/91489215