鱼C论坛

 找回密码
 立即注册
查看: 26529|回复: 19

[技术交流] 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)

[复制链接]
发表于 2013-6-30 01:43:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
动态载入 DLL

动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数。

方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址。当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中把它给卸载。

动态调用使用的 Windows API 函数主要有 3 个, 分别是 LoadLibrary、 GetProcAddress 和FreeLibrary。

我们分别详细介绍这三个函数的功能,因为无论学习编程还是逆向这是三个函数都是非常常用滴。


(1)LoadLibrary 函数

注:Delphi 中还提供了 SafeLoadLibrary 函数,它封装了 Loadlibrary 函数,可以装载由 Filename 参数指定的 WindowsDLL或 Linux 共享对象。它简化了DLL的装载并且使装载更加安全。

[格式]:
function LoadLibrary(LibFileName : PChar): Thandle; 
[功能]:加载由参数 LibFileName 指定的 DLL 文件。

[说明]:参数 LibFileName 指定了要装载的 DLL 文件名,如果 LibFileName 没有包含一个路径,系统将按照:当前目录、Windows 目录、Windows 系统目录、包含当前任务可执行文件的目录、列在 PATH 环境变量中的目录等顺序查找文件。

如果函数操作成功,将返回装载 DLL 库模块的实例句柄,否则,将返回一个错误代码,错误代码的定义如下表所示。


错误代码
  含义
  0
  系统内存不够,可执行文件被破坏或调用非法
  2
  文件没有被发现
  3
  路径没有被发现
  5
  企图动态链接一个任务错误或者有一个共享或网络保护错误
  6
  库需要为每个任务建立分离的数据段  
  8
  没有足够的内存启动应用程序  
  10
  Windows  版本不正确  
  11
  可执行文件非法或不是Windows  应用程序,或在.  EXE映像中有错误  
  12
  应用程序为一个不同的操作系统设计(如  OS/2  
  13
  应用程序为  MS  DOS   4. 0  设计  
  14
  可执行文件的类型不知道  
  15
  试图装载一个实模式应用程序(为早期Windows  版本设计)
  16
  试图装载包含可写的多个数据段的可执行文件的第二个实例  
  19
  试图装载一个压缩的可执行文件(文件必须被解压后才能被装载)  
  20
  DLL  文件非法
  21
  应用程序需要  32  位扩展

假如在应用程序中用 LoadLibrary 函数装入某一个 DLL 前, 其他应用程序已把该 DLL 装入内存中了,则系统将不再装入该 DLL 的另一个实例,而是使该 DLL 的“引用计数”加 1 。


(2)GetProcAddress 函数

[格式]:
function GetProcAddress(Module:Thandle; ProcName:PChar): TfarProc;
[功能]:返回参数 Module 指定的模块中,由参数 ProcName 指定的过程或函数的入口地址。

[说明]:参数 Module 包含被调用函数的 DLL 句柄,这个值由 LoadLibrary 返回, ProcName
是指向含有函数名的以 nil 结尾的字符串指针,或者可以是函数的次序值,但大多数情况下,用函数名是一种更稳妥的选择。如果该函数执行成功,则返回 DLL 中由参数 ProcName 指定的过程或函数的入口地址,否则返回 nil 。


(3)FreeLibrary 函数

[格式]:
procedure  FreeLibrary(Module: Thandle);
[说明]:将由参数 Module 指定的 DLL 文件从内存中卸载 1 次。

[说明]:Module 为 DLL 库的句柄。这个值由 LoadLibrary 返回。由于 DLL 在内存中只装载一次,因此调用 FreeLibrary 首先使 DLL 的引用计数减 1,如果计数减为 0 则卸载该 DLL。

[注意]:每调用一次 LoadLibrary 函数就应调用一次 FreeLibrary 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-30 05:27:15 | 显示全部楼层
沙发... :lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 07:47:06 | 显示全部楼层
.............................
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 08:12:24 | 显示全部楼层
谢谢甲鱼老师,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 08:16:54 | 显示全部楼层
:P顶!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 08:43:16 | 显示全部楼层
起的这么早
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 09:35:02 | 显示全部楼层
Module 为 DLL 库的句柄。这个值由 LoadLibrary 返回。由于 DLL 在内存中只装载一次,因此调用 FreeLibrary 首先使 DLL 的引用计数减 1,如果计数减为 0 则卸载该 DLL。

每调用一次 LoadLibrary 函数就应调用一次 FreeLibrary 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。


学习了。
:lol

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 10:26:14 From FishC Mobile | 显示全部楼层
谢谢↖(^ω^)↗小甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 14:31:27 | 显示全部楼层
顶一个  我不知道还有FreeLibrary这个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-30 22:33:19 | 显示全部楼层
谢谢分享,收藏了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-30 22:45:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-1 00:06:44 | 显示全部楼层
这都这么少的人?:(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-1 00:22:53 | 显示全部楼层
顶你一个,呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-14 01:41:05 | 显示全部楼层
谢谢楼主分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-15 00:27:03 | 显示全部楼层
祝鱼C论坛红红火火!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-5 23:59:18 | 显示全部楼层
学习了  感谢小甲鱼  希望小甲鱼多发精品 当然速度也要快啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-29 13:44:41 | 显示全部楼层
学习了  感谢小甲鱼  希望小甲鱼多发精品 当然速度也要快啊---本人非常喜欢您的讲课风格,和DELPHI:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-3 14:11:16 | 显示全部楼层
有没有关于制作二维码的部分内容,
DELPHI制作二维码来一节课不???????????????:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-1 16:47:31 | 显示全部楼层
支持下来看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-1 16:51:53 | 显示全部楼层
来看看支持下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 22:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表