Почему RegOpenKeyEx() возвращает код ошибки 2 на Vista 64bit?

Я делал следующий звонок:

result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);

(С++, Visual Studio 5, Vista 64 бит).

Он не работает с кодом ошибки 2 ( "Файл не найден" ), хотя "regedit" показывает, что ключ существует. Этот код всегда работал на 32-битной XP. Почему "файл не найден", когда он явно там?

Ответ 2

В 64-разрядной системе Windows реестр фактически разделен на две части. Один раздел используется 64-битными процессами, а одна часть - 32-разрядными процессами.

Например, если 32-битное приложение программно записывает то, что, по его мнению, является HKLM\SOFTWARE\Company\Application, оно фактически перенаправлено WoW64-слоем в HKLM\SOFTWARE\Wow6432Node\Company\Application.

Итак, когда вы запускаете свое 32-битное приложение и вызываете RegOpenKeyEx, он фактически работает против Wow6432Node \, а не обычного \SOFTWARE node.

Ответ 3

У меня была аналогичная проблема. Я использовал:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   (LPWSTR)"SOFTWARE\\0test",
                                   0,
                                   WRITE_DAC ,
                                   &hKey);

Это не сработало. Я пробовал это так и работал:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   _T("SOFTWARE\\0test"),
                                   0,
                                   WRITE_DAC ,
                                   &hKey);

Ответ 5

Вы должны скомпилировать с помощью "Использовать многобайтовый набор символов" или лить строку в коде (LPWSTR)