2008-10-31 6 views
25

я делал следующий вызов:Почему RegOpenKeyEx() возвращает код ошибки 2 на Vista 64bit?

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

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

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

ответ

51

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

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

Для полного объяснения: 32-bit and 64-bit Application Data in the Registry

20

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

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

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

+2

Обратите внимание, что вы не должны полагаться на ключе называют «Wow6432Node ». Получите доступ к другому представлению реестра, используя флаги вместо `RegOpenKeyEx`. – 2011-07-29 17:46:44

0

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

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

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

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

Никогда не вставляйте отливки, чтобы заткнуть компилятор. Компилятор правильно отказался от компиляции первого без трансляции. – 2011-07-29 17:47:11

0

Вы должны компилировать с «Многобайтовым Character Set» или отливаются из строки в коде на (LPWSTR)