Mr.*_*C64 2 c++ registry winapi
假设您要开发一个函数,在给定有效的注册表项句柄和值名称的情况下,如果该值存在于输入项下,则返回true,否则返回false,并在所有其他情况下抛出 C++ 异常。
bool RegValueExists(HKEY hKey, const std::wstring& value)
{
LRESULT retCode = ::RegGetValue(
hKey,
nullptr, // no subkey
value.c_str(),
RRF_RT_ANY, // any type
nullptr, nullptr, nullptr // not interested in these
);
Run Code Online (Sandbox Code Playgroud)
如果RegGetValue成功,则返回0;所以,在这种情况下,我可以返回true给调用者。
但是,从的MSDN文档RegGetValue,它并不清楚什么没有发现注册表值的情况下,API返回:
返回值
[...] 如果函数失败,返回值是系统错误代码。
在我的测试中,如果未找到值,则RegGetValue返回2(即ERROR_FILE_NOT_FOUND)。但是,我找不到任何官方的MSDN 页面来记录这一点。(此外,因为注册表值什么时候是文件??)
在“系统错误代码”中还有一个ERROR_NOT_FOUND代码 ( 1168)。将其作为“未找到注册表值”的返回码是否合理?
我认为至少应该对 MSDN 中的常见错误代码进行清楚的解释。
RegQueryValueEx 有更详细的错误说明:
如果 lpValueName 注册表值不存在,则该函数返回 ERROR_FILE_NOT_FOUND。
因此,如果您想安全起见,请使用该函数而不是RegGetValue.
从你的例子中,我看到,你不需要任何的特殊功能RegGetValue,我认为这些功能甚至可以用组合模拟RegOpenKeyEx和RegQueryValueEx。