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

0

Я пытаюсь получить значение из раздела реестра, и последняя программа должна работать как на 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-битные компьютеры стали популярными, и ни один из эпизодических элементов, которые я написал с тех пор, не имел этой проблемы.

  • 0
    ссылка Существует 2 пространства реестра - 32-битное и 64-битное. Они различаются по содержанию, и вы можете получить доступ к одному за раз, насколько мне известно.
  • 1
    32-разрядные и 64-разрядные ключи реестра находятся в разных местах, поэтому это зависит от того, какой реестр следует запросить. Таким образом, для 32-битной системы вам необходимо 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/…
Показать ещё 6 комментариев
Теги:
registry
32bit-64bit

1 ответ

2
Лучший ответ

В 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню