如何测试注册表项是否存在?

时间:2018-08-06 17:28:13

标签: c++ registry exists

首先,这是一个遗留项目,非常古​​老,我拥有将其更新为最新的短稻草。

我注意到错误之一是该应用程序依赖于已经存在的注册表结构。我要测试结构是否存在,如果不创建任何丢失的密钥。

有一个名为CRegKey的现有类,它是Open方法:

    inline LONG CRegKey::Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired) throw() {
        ATLASSUME(hKeyParent != NULL);
        HKEY hKey = NULL;
        LONG lRes = RegOpenKeyEx(hKeyParent, lpszKeyName, 0, samDesired, &hKey);
        if (lRes == ERROR_SUCCESS) {
            lRes = Close();
            ATLASSERT(lRes == ERROR_SUCCESS);
            m_hKey = hKey;
    #if WINVER >= 0x0501
            m_samWOW64 = samDesired & (KEY_WOW64_32KEY | KEY_WOW64_64KEY);
    #endif
        }
        return lRes;
    }

问题是我在调用此例程时发现了,如果键不存在,它将返回ERROR_SUCCESS,这是一个典型示例:

    DWORD dwRes = rKey.Open(HKEY_LOCAL_MACHINE, szPath, KEY_READ);

在上面的示例中,szPath的值为:

    SOFTWARE\Name\Scada\LonAgent

我已经导出了原始注册表,并且出于测试目的,已经删除了“ LonAgent”键。

问题在于,尽管该密钥不存在,但dwRes仍为0,与ERROR_SUCCESS相同。...为什么?

1 个答案:

答案 0 :(得分:1)

结果清楚地表明注册表项存在。对于32位程序,注册表项的重定向如下:

HKEY_LOCAL_MACHINE\SOFTWARE\Name\Scada\LonAgent重定向为:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Name\Scada\LonAgent

使用KEY_WOW64_64KEY停止重定向

DWORD dwRes = rKey.Open(HKEY_LOCAL_MACHINE, szPath, KEY_WOW64_64KEY | KEY_READ);

但这通常不适用于32位程序。而是使用KEY_WOW64_32KEY强制重定向,或仅使用KEY_READ