Как проверить, существует ли раздел реестра?

Во-первых, это устаревший проект, очень старый, у меня есть небольшая соломинка для его обновления.

Я заметил, что одной из ошибок является то, что приложение опирается на уже существующую структуру реестра. Я хочу проверить наличие структуры и, если нет, создать какие-либо недостающие ключи.

Существует существующий класс 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

Решение

Результат ясно указывает на то, что раздел реестра существует. Для 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector