我正在寻找一种干净的方式来检查注册表项是否存在。我曾假设如果我试图打开一个不存在的密钥,RegOpenKey会失败,但它不会。检查是否存在注册表项
我可以使用字符串处理来查找并打开我正在查找的父键,然后枚举该键的子键以查明我感兴趣的键是否存在,但这两者都感觉到就像性能猪一样,并且像一种奇怪的方式来实现这样一个简单的功能。
我想你可以使用RegQueryInfoKey为此,但MSDN并没有提供太多的细节,以防万一它是可能的。
更新:我需要直接win32 API的解决方案,而不是托管代码,.NET或任何其他库。
MSDN中的文档似乎表明,你应该能够打开读取权限的关键,并得到一个错误,如果它不存在,就像这样:
lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS)
{
if (lResult == ERROR_FILE_NOT_FOUND) {
不过,我得到ERROR_SUCCESS时我试试这个。
更新2:我确切的代码是这样的:
HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {
...但结果出来为ERROR_SUCCESS,即使我已经把不存在的关键。
更新3:看起来你们是对的。这在一个特定的测试例子上(神秘地)失败了。如果我在任何其他键上尝试它,它会返回正确的结果。使用注册表编辑器对其进行双重检查仍然不会显示密钥。不知道该怎么做。
你正在检查的密钥的路径是什么?是否有可能遇到重定向的魔法路径之一(如Wow6432Node)?我有一个模糊的回忆,以前看到这个问题。我想你可以打开一个不存在的密钥。实际尝试设置或查询该密钥中的值时,您会失败。 – 2009-08-27 21:37:01
它也可以在[注册表VirtualStore](http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx)。 – ghord 2013-05-31 11:48:17