Я делал следующий звонок:
result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);
(C++, 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.
У меня была аналогичная проблема. Я использовал:
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)
Обратите внимание, что вы не должны полагаться на то, что ключ называется «Wow6432Node». Получите доступ к другому представлению реестра, используя вместо этого флаги для
RegOpenKeyEx.