Ответ 1
Я обнаружил, что могу решить свою проблему с помощью флага: KEY_WOW64_64KEY
, как в:
result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);
Для полного объяснения: 32-разрядные и 64-разрядные данные приложения в реестре
Я делал следующий звонок:
result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);
(С++, Visual Studio 5, Vista 64 бит).
Он не работает с кодом ошибки 2 ( "Файл не найден" ), хотя "regedit
" показывает, что ключ существует. Этот код всегда работал на 32-битной XP. Почему "файл не найден", когда он явно там?
Я обнаружил, что могу решить свою проблему с помощью флага: KEY_WOW64_64KEY
, как в:
result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);
Для полного объяснения: 32-разрядные и 64-разрядные данные приложения в реестре
В 64-разрядной системе Windows реестр фактически разделен на две части. Один раздел используется 64-битными процессами, а одна часть - 32-разрядными процессами.
Например, если 32-битное приложение программно записывает то, что, по его мнению, является HKLM\SOFTWARE\Company\Application, оно фактически перенаправлено WoW64-слоем в HKLM\SOFTWARE\Wow6432Node\Company\Application.
Итак, когда вы запускаете свое 32-битное приложение и вызываете RegOpenKeyEx, он фактически работает против Wow6432Node \, а не обычного \SOFTWARE node.
У меня была аналогичная проблема. Я использовал:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
(LPWSTR)"SOFTWARE\\0test",
0,
WRITE_DAC ,
&hKey);
Это не сработало. Я пробовал это так и работал:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\0test"),
0,
WRITE_DAC ,
&hKey);
да, win7 64B, добавьте еще один флаг KEY_WOW64_64KEY, он будет работать. если не работает, обратитесь к http://msdn.microsoft.com/en-us/library/ms724897(v=VS.85).aspx
Вы должны скомпилировать с помощью "Использовать многобайтовый набор символов" или лить строку в коде (LPWSTR)