在预定义的注册表项句柄上调用RegCloseKey

时间:2017-04-20 17:11:07

标签: c++ winapi registry

考虑围绕原始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); 
}

2 个答案:

答案 0 :(得分:3)

RegOpenKey function的MSDN文档推断您只想在以编程方式创建的句柄上调用RegCloseKey

... 如果密钥不是预定义的注册表项之一,请在使用完句柄后调用RegCloseKey函数。

答案 1 :(得分:1)

我找不到官方文档说它没问题,但我知道它有效。

我最接近的是this book

  

您实际上可以在其中一个预定义的根密钥条目上调用RegCloseKey。

它可能在野外发生了很多事情,所以我无法想象微软将来会改变这种情况,但如果你想冒风险,那么如果没有官方文档,它真的取决于你。

相关问题