鱼C论坛

 找回密码
 立即注册
查看: 4202|回复: 0

[API档案] GetModuleHandleEx

[复制链接]
发表于 2016-7-12 02:43:21 | 显示全部楼层 |阅读模式

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

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

x
注:本文档由 Diu 翻译,小甲鱼校对。

原文链接 -> 传送门

函数功能:

GetModuleHandleEx 函数用于获取指定模块的模块句柄,并且增加该模块的引用计数,除非指定了 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT。该模块必须已经被调用进程加载。

API 函数原型:

注释:_In_ 说明该参数是输入的,_Out_ 说明该参数是输出的,_opt_ 说明该参数是可选的。
BOOL WINAPI GetModuleHandleEx(
  _In_     DWORD   dwFlags,
  _In_opt_ LPCTSTR lpModuleName,
  _Out_    HMODULE *phModule
);

参数解析:

参数 含义
dwFlags 该参数可以为 0 或者为下列值中的一个或多个。如果模块的引用计数增加了,在不需要改模块句柄时,调用者必须使用 FreeLibrary 函数来减少引用计数:
含义
GET_MODULE_HANDLE_EX_FLAG_
FROM_ADDRESS
(0x00000004)
lpModuleName 参数为模块中的某个地址
GET_MODULE_HANDLE_EX_FLAG_
PIN(0x00000001)
1. 该模块保持加载直到进程被终止,而无论 FreeLibrary 函数被调用了多少次
2. 该选项不能与 GET_MODULE_HANDLE_EX_FLAG_
UNCHANGED_REFCOUNT 同时使用
GET_MODULE_HANDLE_EX_FLAG_
UNCHANGED_REFCOUNT
(0x00000002)
1. 模块的引用计数不会增加。该选项的行为与 GetModuleHandle 函数相同。不要将获取的模块句柄传递给 FreeLibrary 函数;如果这样做,会导致 DLL 提前被卸载。更多信息,请参见备注部分
2. 该选项不能与 GET_MODULE_HANDLE_EX_FLAG_PIN 同时使用
lpModuleName1. 已被加载的模块的名称(一个 .dll 或 .exe 文件),或模块中的某个地址(如果 dwFlags 为 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
2. 对于一个模块名称,如果文件的扩展名被忽略,则会添上默认链接库扩展名 .dll 文件名字符串可以包含尾部点号(.)来指示该模块没有扩展名。并且文件名字符串不需要指定路径。当指定路径时,确保使用反斜杠(\),而不是斜杠(/)。该文件名字符串(不区分大小写)会与当前映射到调用进程地址空间的模块名字进行比较
3. 如果该参数为 NULL,GetModuleHandleEx 函数返回用于创建该调用进程的文件的句柄(.exe 文件)
phModule1. 指定模块的句柄。如果函数调用失败,则该参数为 NULL
2. GetModuleHandleEx 函数不会获取使用 LOAD_LIBRARY_AS_DATAFILE 标志加载的模块。更多信息,请参见 LoadLibraryEx 函数


返回值:

1. 如果函数调用成功,则返回值为非 0;

2. 如果函数调用失败,则返回值为 0。

获取有关错误的更多信息,请调用 GetLastError 函数。


备注:

1. 返回的句柄不是全局的,也不是可继承的。它不能被其他进程复制或者使用。

2. 如果 lpModuleName 参数不包含路径,并且已加载的模块中有几个具有该名称和扩展名,你将不能预料到到底哪一个模块句柄将被返回。为了解决这个问题,你可以使用 side-by-side assemblies 指定一个路径,或者使用 GetModuleHandleEx 函数来指定一个内存空间而不是一个 DLL 名称。

3. 如果 dwFlags 参数包含 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,那么 GetModuleHandleEx 函数将返回一个已被映射的模块的句柄,但不会增加它的引用计数。然而如果将该句柄传递给 FreeLibrary 函数,那么该映射模块的引用计数将减少。因此,不要将通过使用 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 的 GetModuleHandleEx 返回的句柄传递给 FreeLibrary 函数。如果这样做,将会导致 DLL 模块提前被卸载。

4. 如果 dwFlags 参数包含 GET_MODULE_HANDLE_EX_UNCHANGED_REFCOUNT,该函数在多线程应用程序中必须小心使用。模块句柄在该函数返回该句柄和使用该句柄之间不能保证一直有效。例如,假设一个线程获取了一个模块句柄,但是在它使用该句柄之前,第二个线程释放了该模块。如果系统加载另外的模块,它会使用最近释放的模块句柄。因此,第一个线程得到的句柄是一个与期望不同的模块的句柄。

5. 为了编译使用该函数的应用程序,需要定义 _WIN32_WINNT 为 0x0501 或后续版本。更多信息,请参见 Using the Windows Headers


需求:

Minimum supported client Windows XP [桌面应用程序]
Minimum supported server Windows 2003 服务器版 [桌面应用程序]
Header Winbase.h(包含于 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll
Unicode and ANSI names GetModuleHandleExW(Unicode) 和 GetModuleHandleExA(ANSI)


【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 16:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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