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

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

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

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

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


person Tim Cooper    schedule 31.10.2008    source источник


Ответы (5)


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

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

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

person Tim Cooper    schedule 31.10.2008

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

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

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

person Frode Lillerud    schedule 14.11.2008
comment
Обратите внимание, что вы не должны полагаться на то, что ключ называется Wow6432Node. Получите доступ к другому представлению реестра, используя вместо этого флаги RegOpenKeyEx. - person Billy ONeal; 29.07.2011

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

person GMG    schedule 04.06.2017

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

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

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

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   _T("SOFTWARE\\0test"),
                                   0,
                                   WRITE_DAC ,
                                   &hKey);
person Alex    schedule 23.06.2010
comment
Никогда не вставляйте просто приведение типов, чтобы выключить компилятор. Компилятор правильно отказался от компиляции первого без приведения. - person Billy ONeal; 29.07.2011

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

person yue    schedule 21.11.2011