假设您要开发一个函数,在给定有效的注册表键句柄和值名称的情况下,如果输入键下存在该值,则返回 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中的常见错误代码。
答案 0 :(得分:4)
RegQueryValueEx
有更详细的错误说明:
如果lpValueName注册表值不存在,则返回该函数 ERROR_FILE_NOT_FOUND。
因此,如果您想要安全起见,请使用该功能而不是RegGetValue
。
从您的示例中我看到您不需要RegGetValue
的任何特殊功能,我认为这些功能甚至可以使用RegOpenKeyEx
和RegQueryValueEx
的组合进行模拟。
答案 1 :(得分:3)
没有所有故障模式及其错误代码的文档。这只是事情的方式。某些故障模式被明确调出,并记录了错误代码。
但是,我可以确认ERROR_FILE_NOT_FOUND
是与问题中描述的故障模式相关联的错误代码。
答案 2 :(得分:0)
期望任何返回值但ERROR_SUCCESS是错误代码是合理的。可能返回的错误代码的确切列表可能因Windows版本而异。
我认为应该至少清楚地解释MSDN中的常见错误代码。
但您在MSDN页面中的引用实际上包含指向list of system error codes的链接,您也可以随时致电FormatMessageW
获取错误说明。