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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果我不存储GetModuleHandle的返回值,是否需要关闭句柄?相关的知识,希望对你有一定的参考价值。

我想知道我是否必须关闭手柄,例如我是这样打电话给GetModuleHandle

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

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

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

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

答案

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

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

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

另一答案

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

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

GetModuleHandle返回一个HMODULE - 实际上是一个加载的EXE或DLL的基地址,并且因为它不是HANDLE,所以不需要,也不一定是CloseHandle发布的。

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

以上是关于如果我不存储GetModuleHandle的返回值,是否需要关闭句柄?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 DLL 的文件名?

如何清除 LiveData 存储值?

即使值存在,localStorage.getItem() 也始终返回 null

从存储过程中获取返回值

如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]

PDO 存储过程返回值