Во-первых, это устаревший проект, очень старый, у меня есть небольшая соломинка для его обновления.
Я заметил, что одной из ошибок является то, что приложение опирается на уже существующую структуру реестра. Я хочу проверить наличие структуры и, если нет, создать какие-либо недостающие ключи.
Существует существующий класс 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 …. почему?
Результат ясно указывает на то, что раздел реестра существует. Для 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
Других решений пока нет …