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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值