在预定义注册表项句柄上调用RegCloseKey 考虑C++包装类的情况,在WRAW HKEY < /代码>句柄。< /P>

在预定义注册表项句柄上调用RegCloseKey 考虑C++包装类的情况,在WRAW HKEY < /代码>句柄。< /P>,c++,winapi,registry,C++,Winapi,Registry,包装类有一个构造函数重载,将HKEY句柄作为输入:构造的对象拥有输入原始句柄的所有权。 析构函数调用包装句柄上的RegCloseKey(),该句柄存储在HKEY m_HKEY数据成员中 现在,考虑一个预定义句柄如HKEY-CurrTyAuthUs>代码>被传递给构造函数重载的情况。HKEY\U当前用户值分配给m\U HKEY成员 析构函数对该预定义键调用RegCloseKey()。在我的实验中,API在本例中返回0,这意味着:成功。那么,在预定义的注册表项句柄上调用RegCloseKey()可以

包装类有一个构造函数重载,将
HKEY
句柄作为输入:构造的对象拥有输入原始句柄的所有权。
析构函数调用包装句柄上的
RegCloseKey()
,该句柄存储在
HKEY m_HKEY
数据成员中

现在,考虑一个预定义句柄如HKEY-CurrTyAuthUs>代码>被传递给构造函数重载的情况。

HKEY\U当前用户
值分配给
m\U HKEY
成员

析构函数对该预定义键调用
RegCloseKey()
。在我的实验中,API在本例中返回0,这意味着:成功。那么,在预定义的注册表项句柄上调用
RegCloseKey()
可以吗? 或者应该实施进一步的检查,例如:

RegistryKey::~RegistryKey()
{
    if ((m_hKey != nullptr) && !IsPredefinedKey(m_hKey))
        ::RegCloseKey(m_hKey); 
}
的MSDN文档推断您只想对通过编程创建的句柄调用
RegCloseKey


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

我找不到官方文档说明它可以,但我知道它可以工作

我得到的最接近的结果是:

实际上,您可以对其中一个预定义的根键项调用RegCloseKey


这可能在野外经常发生,因此我无法想象微软将来会改变这一点,但如果没有官方文档,您是否愿意冒险,则完全取决于您。

我在的MSDN文档中看到了类似的内容。事实上,我期望返回值不同于0,来自使用预定义键调用的
RegCloseKey
;但是,在我的测试中,
RegCloseKey
总是返回0。我在
RegOpenKeyEx
中也看到了这一点。只是我的$0.02,但我可能会犯一个谨慎的错误,即使它看起来无害,也不会尝试关闭手柄。无论它是否安全,这都是未记录的行为。根据文档:“要关闭的打开键的句柄。该句柄必须已由
RegCreateKeyEx
regcreatekeytransated
RegOpenKeyEx
regopenkeytransated
RegConnectRegistry
函数打开。”然后,关于的文档又有冲突信息:“预定义句柄不是线程安全的。关闭一个线程中的预定义句柄会影响正在使用该句柄的任何其他线程。“@Remy您可以打开预定义句柄,如果子键路径为空,则RegOpenKey(非Ex)可以返回与您传入的句柄相同的句柄。@Anders:是的,是的,但这返回到Phil的答案。如果通过
RegOpenKey()返回的密钥
是预定义的注册表项,不要关闭它。允许您映射预定义的注册表项(例如HKCU)到指定的注册表项。如果关闭预定义的句柄,映射将中断。我们花了一段时间才弄清楚这一点。我建议您不要关闭预定义的句柄,除非您有非常具体的原因。可能是您希望禁止将预定义的键传递到包装类构造函数中。