动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
来源:互联网 发布:网络驱动器异常 编辑:程序博客网 时间:2024/05/20 06:05
动态载入 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 库模块的实例句柄,否则,将返回一个错误代码,错误代码的定义如下表所示。
假如在应用程序中用 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 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- 函数说明(LoadLibrary 、GetProcAddress、FreeLibrary) 08.10.31
- LoadLibrary 和 GetProcAddress、FreeLibrary
- LoadLibrary 和 GetProcAddress、FreeLibrary
- 解析LoadLibrary,GetProcAddress,FreeLibrary
- LoadLibrary 和 GetProcAddress、FreeLibrary
- LoadLibrary 、 GetProcAddress和FreeLibrary
- LoadLibrary GetProcAddress FreeLibrary 近距应用
- 通过LoadLibrary() 与 GetProcAddress()获得Dll内的函数
- 动态调用DLL. LoadLibrary和GetProcAddress
- 解析Delphi中的LoadLibrary,GetProcAddress,FreeLibrary
- GetProcAddress() LoadLibrary() DLL
- LoadLibrary函数和FreeLibrary函数
- 用LoadLibrary和GetProcAddress函数调用dll的代码有问题
- LoadLibrary和FreeLibrary的流程
- 关于DLL包含窗体,LoadLibrary后使用正常,但在FreeLibrary时,出错的问题;
- LoadLibrary,GetProcAddress
- 【廖雪峰Python习题集】map/reduce
- (转) Android 相机预览方向及其适配探索
- [Python设计模式]代理模式(Proxy)
- greenDao使用
- c++11多线程编程(七):条件变量说明
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- 表单验证封装集成到项目中
- 空间数据矢量模型之DIME模型与PLOYVRT模型
- A Deep Regression Architecture with Two-Stage Re-initialization for High Performance Facial Landmark
- activemq的几种基本通信方式总结(点对点-发布订阅)
- 文件引入问题
- 编译安装php7
- java web开发(二) 接口开发
- 使用JSONObject所需jar包,云盘链接下载