考虑围绕原始HKEY
句柄的C ++包装类的情况。
包装器类有一个构造函数重载,以HKEY
句柄作为输入:构造的对象取得输入原始句柄的所有权。
析构函数在包装的句柄上调用RegCloseKey()
,存储在HKEY m_hKey
数据成员中。
现在,考虑将HKEY_CURRENT_USER
等预定义句柄传递给构造函数重载的情况。 HKEY_CURRENT_USER
值已分配给m_hKey
成员。
析构函数在该预定义键上调用RegCloseKey()
。在我的实验中,API在这种情况下返回0,意思是:成功。那么,在预定义的注册表键句柄上调用RegCloseKey()
是否可以?
或者应该进一步检查,例如:
RegistryKey::~RegistryKey()
{
if ((m_hKey != nullptr) && !IsPredefinedKey(m_hKey))
::RegCloseKey(m_hKey);
}
答案 0 :(得分:3)
RegOpenKey
function的MSDN文档推断您只想在以编程方式创建的句柄上调用RegCloseKey
。
... 如果密钥不是预定义的注册表项之一,请在使用完句柄后调用RegCloseKey
函数。
答案 1 :(得分:1)
我找不到官方文档说它没问题,但我知道它有效。
我最接近的是this book:
您实际上可以在其中一个预定义的根密钥条目上调用RegCloseKey。
它可能在野外发生了很多事情,所以我无法想象微软将来会改变这种情况,但如果你想冒风险,那么如果没有官方文档,它真的取决于你。