Я пытаюсь получить значение из раздела реестра, и последняя программа должна работать как на 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-битные компьютеры стали популярными, и ни один из эпизодических элементов, которые я написал с тех пор, не имел этой проблемы.
В 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
.
OR
ваш флагKEY_READ
с помощьюKEY_WOW64_32KEY
для 64-битнойKEY_WOW64_64KEY
OR
с помощьюKEY_WOW64_64KEY
чтобы 64-битное приложениеKEY_WOW64_64KEY
запрашивать 32-битные или 64-битные ключи. Обычно вы можете обнаружить это, используяifdef _M_X64
для 64-битной системы, а затем установить соответствующий флаг. См. Msdn.microsoft.com/en-gb/library/windows/desktop/… и msdn.microsoft.com/en-gb/library/windows/desktop/…