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

时间:2017-04-20 18:11:21

标签: c++ winapi registry

假设您要开发一个函数,在给定有效的注册表键句柄和值名称的情况下,如果输入键下存在该值,则返回 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
    );

如果RegGetValue成功,则返回0;所以,在这种情况下,我可以将true返回给调用者。

但是,从the MSDN documentation of RegGetValue开始,

  

返回值

     

[...]如果函数失败,则返回值是系统错误代码。

在我的测试中,RegGetValue会在未找到值的情况下返回2(即 ERROR_FILE_NOT_FOUND )。但是,我找不到任何记录它的官方 MSDN页面。 (此外,因为何时是注册表值文件 ??)

"系统错误代码" 中还有ERROR_NOT_FOUND代码(1168)。将它作为"未找到注册表值" 的返回代码是否合理?

我认为至少应该明确解释MSDN中的常见错误代码。

3 个答案:

答案 0 :(得分:4)

RegQueryValueEx有更详细的错误说明:

  

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

因此,如果您想要安全起见,请使用该功能而不是RegGetValue

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

答案 1 :(得分:3)

没有所有故障模式及其错误代码的文档。这只是事情的方式。某些故障模式被明确调出,并记录了错误代码。

但是,我可以确认ERROR_FILE_NOT_FOUND是与问题中描述的故障模式相关联的错误代码。

答案 2 :(得分:0)

期望任何返回值但ERROR_SUCCESS是错误代码是合理的。可能返回的错误代码的确切列表可能因Windows版本而异。

  

我认为应该至少清楚地解释MSDN中的常见错误代码。

但您在MSDN页面中的引用实际上包含指向list of system error codes的链接,您也可以随时致电FormatMessageW获取错误说明。