首先,这是一个遗留项目,非常古老,我拥有将其更新为最新的短稻草。
我注意到错误之一是该应用程序依赖于已经存在的注册表结构。我要测试结构是否存在,如果不创建任何丢失的密钥。
有一个名为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相同。...为什么?
答案 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