原文链接 -> 传送门
函数功能:
GetModuleHandle 函数用于获取指定模块的句柄,该模块必须已经被调用进程加载。
使用 GetModuleHandleEx 函数来避免出现备注部分所描述的冲突情况。
API 函数原型:
注释:_In_ 说明该参数是输入的。_opt_ 说明该参数是可选的。
HMODULE WINAPI GetModuleHandle( _In_opt_ LPCTSTR lpModuleName );
参数解析:
|
参数 |
含义 |
|
lpModuleName |
1. 已被加载的模块的名称(一个 .dll 或 .exe 文件)。如果参数忽略文件的扩展名,则会添上默认链接库扩展名 .dll。文件名字符串可以通过包含尾部点号(.)来表示该模块没有扩展名。文件名字符串不需要指定路径。当指定路径时,确保使用反斜杠(\),而不是斜杠(/)。该文件名字符串(不区分大小写)会与当前映射到调用进程地址空间的模块名字进行比较 |
返回值:
1. 如果函数调用成功,则返回值为指定模块的句柄;
2. 如果函数调用失败,则返回值为 NULL。
获取有关错误的更多信息,请调用 GetLastError 函数。
备注:
1. 返回的句柄不是全局的,也不是可继承的。它不能被其他进程复制或者使用。
2. 如果 lpModuleName 不包含路径,并且已加载的模块中有几个具有该名称和扩展名,你将不能预料到到底哪一个模块句柄将被返回。为了解决这个问题,你可以使用 side-by-side assemblies 指定一个路径,或者使用GetModuleHandleEx 函数来指定一个内存空间而不是一个 DLL 名称。
3. GetModuleHandle 函数返回映射模块的句柄,但不会增加该模块的引用次数。然而,如果该句柄被传递给 FreeLibrary函数,映射模块的引用次数将减少。因此,不要传递通过 GetModuleHandle 返回的句柄给 FreeLibrary 函数。因为如此做将会导致一个 DLL 模块过早的卸载。
4. 该函数在多线程应用程序中必须小心使用。模块句柄在该函数返回该句柄和使用该句柄之间不能保证一直有效。例如,假设一个线程获取了一个模块句柄,但是在它使用该句柄之前,第二个线程释放了该模块。如果系统加载另外的模块,它会使用最近释放的模块句柄。因此,第一个线程得到的句柄是一个与期望不同的模块的句柄。
需求:
|
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 |
GetModuleHandleW(Unicode) 和 GetModuleHandleA(ANSI) |




