我想知道是否必须关闭手柄,例如我以这种方式拨打GetModuleHandle
GetProcAddress(GetModuleHandle("modulename"), "nameoftheexportedfunction")
关闭手柄的正确方法是什么?我需要做什么
HMODULE hModule = GetModuleHandle("modulename");
GetProcAddress(hModule, "nameoftheexportedfunction")
CloseHandle(hModule);
如果GetModuleHandle
返回的值没有存储到变量中,它会自动删除吗?
答案 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及其特定的句柄管理要求是无可替代的。