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

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

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

(C++, Visual Studio 5, Vista 64bit).

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

5 ответов


я обнаружил, что могу решить свою проблему, используя флаг: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-layer на HKLM\SOFTWARE\Wow6432Node\Company\Application.

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


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


у меня была похожая проблема. Я использовал:

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