提问人:Azriel Elijay 提问时间:2/11/2023 最后编辑:Azriel Elijay 更新时间:2/13/2023 访问量:121
有没有适当的方法可以检查HKEY/PHKEY是否有效?
Is there a Proper way of Checking if an HKEY/PHKEY is Valid?
问:
REGISTRY()
{
/*HKEY*/m_pRoot = nullptr;
/*HKEY*/m_pReturnKey = nullptr;
m_pPath = nullptr;
m_pValueName = nullptr;
}
~REGISTRY()
{
if ( m_pReturnKey )
{
RegCloseKey(m_pReturnKey);
m_pReturnKey = nullptr;
}
if ( m_pRoot )
{
RegCloseKey(m_pRoot);
m_pRoot = nullptr;
}
}
我有一个类来处理我的应用程序的所有注册表函数,我让对象的析构函数处理 s 的关闭(如上所示)。我采用了这里提供的答案,但不是使用,而是简单地将 s 设置为在对象构造期间,并检查它是否不在销毁期间并关闭它。我还使用智能指针<>使用它来确保即使抛出异常也会调用析构函数。HKEY
HANDLES
HKEY
nullptr
nullptr
unique_ptr
由于 After Checking ,when , , , 或返回除此以外的任何东西,它不对传递的执行任何操作,并且它保持为 .RegOpenKeyExA
RegCreateKeyExA
RegSetValueEx
RegQueryValueExA
ERROR_SUCCESS
HKEY
nullptr
除了这种方法之外,有没有适当的方法可以检查HKEY/PHKEY是否有效?在 winreg.h 上搜索 MSDN 页面没有为我提供任何信息,如果它在那里,我可能是盲目的,或者它没有使用对像我这样的业余爱好者来说不明显的函数名称。
答:
winreg API 不会留出表示无效的值(与 fileapi 不同,CreateFileW
用于此目的)。相反,API 调用会报告它们是否成功,然后才能保证已将 写入调用方提供的位置。HKEY
INVALID_HANDLE_VALUE
HKEY
如果您的实现需要知道任何给定的信息是否代表有效数据,则必须单独记录此信息。从 C++17 开始,std::optional
是用于此目的的标准工具。
因此,解决您的问题的可能解决方案可能是:
class REGISTRY
{
std::optional<HKEY> m_pRoot;
std::optional<HKEY> m_pReturnKey;
// ...
}
REGISTRY::~REGISTRY()
{
if (m_pReturnKey)
// equivalent to
// if (m_pReturnKey.has_value())
{
RegCloseKey(m_pReturnKey.value());
m_pReturnKey = {};
}
// ...
}
m_pRoot
并且是默认初始化的,这意味着它们保存 类型的值。d'tor 会观察这一点,并且不做任何事情。如上所述,这解决了问题。m_pReturnKey
std::nullopt_t
评论
std::optional
winreg
HKEY
ERROR_SUCCESS
HKEY
评论
有一个实例 RegCreateKeyExA
返回ERROR_SUCCESS
但当使用HKEY
时,它导致了访问冲突”——唯一可能发生的方式是,如果您以使其无效的方式覆盖了自身,或者您与 一起使用的其他参数在某种程度上无效。HKEY
HKEY