Почему RegOpenKeyEx () возвращает код ошибки 2 в Vista 64bit? - PullRequest
27 голосов
/ 31 октября 2008

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

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

(C ++, Visual Studio 5, Vista, 64-разрядная версия).

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

Ответы [ 5 ]

56 голосов
/ 31 октября 2008

Я обнаружил, что могу решить свою проблему, используя флаг: KEY_WOW64_64KEY, например:

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

Для полного объяснения: 32-битные и 64-битные данные приложений в реестре

23 голосов
/ 14 ноября 2008

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

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

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

1 голос
/ 04 июня 2017

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

0 голосов
/ 21 ноября 2011

да , win7 64B, добавьте еще флаг KEY_WOW64_64KEY, он будет работать. если не работает, обратитесь к http://msdn.microsoft.com/en-us/library/ms724897(v=VS.85).aspx

0 голосов
/ 23 июня 2010

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

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

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

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