捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >API档案 > 正文
3 2017.06

GetModuleHandleEx

点击次数:1383 更新时间:2017-6-3 21:17:35  【打印此页

原文链接 -> 传送门

函数功能:

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)


 

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1383 更新时间:2017-6-3 21:17:35  【打印此页

上一条:RaiseException

下一条:FreeLibrary

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修