原文链接 -> 传送门
函数功能:
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 函数来减少引用计数:
|
||||||||
|
lpModuleName |
1. 已被加载的模块的名称(一个 .dll 或 .exe 文件),或模块中的某个地址(如果 dwFlags 为 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS) |
||||||||
|
phModule |
1. 指定模块的句柄。如果函数调用失败,则该参数为 NULL |
返回值:
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) |




