如果我不存储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的返回值,是否需要关闭句柄?的主要内容,如果未能解决你的问题,请参考以下文章
即使值存在,localStorage.getItem() 也始终返回 null