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

What does RegGetValue return when the requested registry value is not found?

本文关键字:ReggetValue 返回 什么 找不到 请求 注册表      更新时间:2023-10-16

假设您要开发一个函数,给定有效的注册表密钥句柄和一个值名,返回 true 如果该值在输入密钥下存在,<</em>em> 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退还给呼叫者。

但是,从RegGetValue的MSDN文档中, 清楚找不到API在未找到注册表值时返回的内容:

返回值

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

在我的测试中,RegGetValue返回2(即 ERROR_FILE_NOT_FOUND (,如果找不到值。但是,我找不到任何官方 MSDN页面记录了这一点。(此外,由于注册表值a file ??(

"系统错误代码"中,还有一个ERROR_NOT_FOUND代码(1168(。将其视为"未找到注册表值"

的返回代码是合理的

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

RegQueryValueEx具有更详细的错误规范:

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

因此,如果您想站在安全方面,请使用该功能而不是RegGetValue

从您的示例中,我看到您不需要RegGetValue的任何特殊功能,我认为这些功能甚至可以通过RegOpenKeyExRegQueryValueEx的组合来模仿。

没有所有故障模式及其错误代码的文档。那只是事物的方式。使用已记录的错误代码明确调用某些故障模式。

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

可以合理地期望任何返回的值,而error_success是错误代码。潜在返回的错误代码的确切列表可能会在Windows版本之间有所不同。

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

但是,您从MSDN页面中的报价实际上包含了指向系统错误代码列表的链接,您也可以随时通过调用FormatMessageW

来获取错误描述。