Правильный способ проверить, является ли Windows 64-битной или нет, во время выполнения? (C ++) - PullRequest
7 голосов
/ 26 января 2010
bool Win64bit = (sizeof(int*) == 8) ? 1 : 0;

Мне это нужно, чтобы мое приложение могло правильно использовать функции реестра Windows (или мне нужно?).

Так я правильно делаю?

Ответы [ 4 ]

15 голосов
/ 26 января 2010

Вот что Раймонд Чен предлагает в своем блоге на http://blogs.msdn.com/oldnewthing/archive/2005/02/01/364563.aspx:

BOOL Is64BitWindows()
{
#if defined(_WIN64)
    return TRUE;  // 64-bit programs run only on Win64
#elif defined(_WIN32)
    // 32-bit programs run on both 32-bit and 64-bit Windows
    // so must sniff
    BOOL f64 = FALSE;
    return IsWow64Process(GetCurrentProcess(), &f64) && f64;
#else
    return FALSE; // Win64 does not support Win16
#endif
}
7 голосов
/ 26 января 2010

Нет, это не может работать как проверка во время выполнения , поскольку sizeof(int*) фиксируется во время компиляции в точке, где вы выбираете компиляцию вашей программы как 32-битной или 64-битной, и после компиляции проверка будет иметь одинаковый фиксированный результат независимо от того, на какой платформе вы ее выполняете.

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

Если вы скомпилируете свою программу как 64-битную, ваша программа будет использовать 64-битный API из-за кода выше и будет корректно работать на 64-битной версии Windows. Он вообще не будет работать в 32-битных окнах, поэтому у вас не будет возможности случайно использовать 64-битный API в 32-битной версии Windows.

v++ platform == 64-bit => sizeof(int*) == 8 => use 64-bit API
AND
( windows platform == 64-bit => 64-bit API works
  OR
  windows platform == 32-bit => program does not run )

Если вы компилируете свою программу в 32-битном режиме, ваша программа будет правильно использовать 32-битные API, которые будут работать на 64-битной платформе Windows в 32-битном режиме совместимости и, очевидно, работать на 32-битной. битовая платформа.

v++ platform == 32-bit => sizeof(int*) == 4 => use 32-bit API
AND
( windows platform == 64-bit => 32-bit API works using compatibility mode
  OR
  windows platform == 32-bit => 32-bit API works )

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

4 голосов
/ 26 января 2010

Кроме того, можно использовать IsWow64Process , чтобы проверить, является ли вы 32-битным процессом (sizeof(void*)==4), работающим под эмуляцией WoW64 на 64-битной Windows-машине.

0 голосов
/ 11 июля 2014

Вот еще один способ: GetSystemWow64Directory - "Извлекает путь к системному каталогу, используемому WOW64. Этот каталог отсутствует в 32-битной Windows." и «В 32-битной Windows эта функция всегда дает сбой, и для расширенной ошибки установлено значение ERROR_CALL_NOT_IMPLEMENTED». Об IsWow64Process Я лично не уверен в использовании, поскольку в MSDN в описании IsWow64Process есть текст «Обратите внимание, что этот метод не является надежным способом определения того, является ли операционная система 64-разрядной версией Windows, Kernel32.dll в текущих версиях 32-битной Windows также содержит эту функцию. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...