马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 同时使用 |
| lpModuleName | 1. 已被加载的模块的名称(一个 .dll 或 .exe 文件),或模块中的某个地址(如果 dwFlags 为 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
2. 对于一个模块名称,如果文件的扩展名被忽略,则会添上默认链接库扩展名 .dll 文件名字符串可以包含尾部点号(.)来指示该模块没有扩展名。并且文件名字符串不需要指定路径。当指定路径时,确保使用反斜杠(\),而不是斜杠(/)。该文件名字符串(不区分大小写)会与当前映射到调用进程地址空间的模块名字进行比较
3. 如果该参数为 NULL,GetModuleHandleEx 函数返回用于创建该调用进程的文件的句柄(.exe 文件) | phModule | 1. 指定模块的句柄。如果函数调用失败,则该参数为 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)所有,转载请注明来源。
|