Что такое 32 и 64-битный код c++?

Я пытаюсь получить значение из раздела реестра, и последняя программа должна работать как на 32, так и на 64-битных машинах.

Код пока:

HKEY hKey; LONG Result1; LONG result2; Result1 = RegOpenKeyEx(HKEY_CLASSES_ROOT,L"Word.Application\\CurVer",0,KEY_READ,&hKey); cout << Result1; cout << "\n"; TCHAR value[255]; DWORD BufferSize = 255; result2 = RegGetValue(hKey, L"Word.Application\\CurVer", L"", RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize); cout << result2;

Я получаю сообщение об ошибке "2" из RegGetValue и смотрю на этот RegOpenKeyEx/RegGetValue, возвращающий ERROR_FILE_NOT_FOUND на существующие ключи, который говорит, что он не будет работать, если это "бит-бит на 64-битной ОС", но я не понимаю что это значит.

Это программа, которая должна быть скомпилирована для разных архитектур, или это RegGetValue, характерный для 32 бит?

К сожалению, большая часть моего C++ программирования была выполнена до того, как 64-битные компьютеры стали популярными, и ни один из эпизодических элементов, которые я написал с тех пор, не имел этой проблемы.

1 ответ

В 64-битной Windows есть два вида реестра, 32-битное представление и 64-битное представление. Это описано в MSDN в разделе " Доступ к альтернативному представлению реестра".

По умолчанию 32-битный процесс будет считываться из 32-битного представления, а 64-битный процесс будет считываться с 64-битного представления. Если вы хотите читать с определенного вида, независимо от архитектуры процесса, вам нужно указать один из следующих флагов: KEY_WOW64_64KEY или KEY_WOW64_32KEY.

Итак, если данные, которые вам нужны, находятся в 32-битном представлении, пройдите KEY_WOW64_32KEY. Если данные находятся в 64-битном представлении просмотра KEY_WOW64_64KEY. Если данные могут быть в любом ключе, проверьте дважды, пропустив KEY_WOW64_32KEY и снова пройдя KEY_WOW64_64KEY.

licensed under cc by-sa 3.0 with attribution.