当未找到请求的注册表值时,RegGetValue 返回什么?

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 中的常见错误代码进行清楚的解释。

zet*_*t42 5

RegQueryValueEx 有更详细的错误说明:

如果 lpValueName 注册表值不存在,则该函数返回 ERROR_FILE_NOT_FOUND。

因此,如果您想安全起见,请使用该函数而不是RegGetValue.

从你的例子中,我看到,你不需要任何的特殊功能RegGetValue,我认为这些功能甚至可以用组合模拟RegOpenKeyExRegQueryValueEx