如果我不存储GetModuleHandle的返回值,是否需要关闭句柄?

时间:2016-06-27 14:14:48

标签: winapi

我想知道是否必须关闭手柄,例如我以这种方式拨打GetModuleHandle

GetProcAddress(GetModuleHandle("modulename"),  "nameoftheexportedfunction")

关闭手柄的正确方法是什么?我需要做什么

HMODULE hModule = GetModuleHandle("modulename"); 
GetProcAddress(hModule, "nameoftheexportedfunction")
CloseHandle(hModule);

如果GetModuleHandle返回的值没有存储到变量中,它会自动删除吗?

2 个答案:

答案 0 :(得分:9)

GetModuleHandle返回HMODULE(又名HINSTANCE - 请参阅What is the difference between HINSTANCE and HMODULE?)。此数据类型无法传递到CloseHandle

HMODULE可以传递给FreeLibrary,但这也不是必需的,因为GetModuleHandle不会增加模块上的引用计数。事实上,调用FreeLibrary可能会导致模块过早地被取消映射,从而导致严重的崩溃。

简而言之:GetModuleHandle会返回一个只读值,不需要以任何方式处理掉。你问题中的第一行代码很好。

答案 1 :(得分:4)

Windows API在这方面可能会非常混乱,因为有很多东西叫做句柄,它们都有不同的规则。

在这种情况下,CloseHandle关闭内核句柄,后者通常引用文件或其他内核资源,例如使用名称创建的同步对象 - 所有这些都通过返回为HANDLE来标识

GetModuleHandle返回HMODULE - 实际上是已加载的EXE或DLL的基地址,因为它不是HANDLE,所以不需要,并且必须不能与CloseHandle一起发布。

正如@David Heffernan所指出的,这并不意味着其他句柄类型永远不会有自己的破坏/释放/取消获取语义,也并不意味着你从API获得的每个HANDLE都必须是传递给CloseHandle。知道您正在处理的特定API及其特定的句柄管理要求是无可替代的。