Обнаружение 32-битной или 64-битной Windows - PullRequest
44 голосов
/ 10 августа 2011

Я хочу определить, является ли текущая ОС Windows 32-разрядной или 64-разрядной. Как этого добиться с помощью C ++? Я не хочу тип процессора Я хочу тип бит ОС. Это потому, что вы можете установить 32-разрядную ОС на 64-разрядный процессор.

Ответы [ 10 ]

44 голосов
/ 10 августа 2011

Функция для вызова: IsWow64Process или IsWow64Process2. Он сообщает вашему 32-битному приложению, работает ли оно на 64-битной Windows.

Если программа скомпилирована для 64 битов, она уже будет знать.

16 голосов
/ 10 августа 2011

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

11 голосов
/ 12 июля 2013
bool getWindowsBit(bool & isWindows64bit)
{
#if _WIN64

    isWindows64bit =  true;
    return true;

#elif _WIN32

    BOOL isWow64 = FALSE;

    //IsWow64Process is not available on all supported versions of Windows.
    //Use GetModuleHandle to get a handle to the DLL that contains the function
    //and GetProcAddress to get a pointer to the function if available.

    LPFN_ISWOW64PROCESS fnIsWow64Process  = (LPFN_ISWOW64PROCESS) 
GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if(fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(), &isWow64))
            return false;

        if(isWow64)
            isWindows64bit =  true;
        else
            isWindows64bit =  false;

        return true;
    }
    else
        return false;

#else

    assert(0);
    return false;

#endif
}
7 голосов
/ 10 августа 2011

вы можете использовать IsWow64Process , если ваше приложение является 32-битным приложением, если это правда, что вы работаете в 64-разрядной ОС, иначе это 32-битная

5 голосов
/ 10 августа 2011

Вам нужно использовать GetNativeSystemInfo.Учитывая, что вы ожидаете, что это будет работать в 32-битной операционной системе, вам нужно использовать LoadLibrary + GetProcAddress, чтобы вы могли справиться с недоступностью этой функции.Так что, если это не поможет, вы знаете, что это 32-разрядная операционная система.Если нет, то SYSTEM_INFO.wProcessorArchitecture дает вам реальный тип процессора вместо эмулируемого.

3 голосов
/ 10 августа 2011

Используйте функцию GetNativeSystemInfo.Он получает параметр LPSYSTEM_INFO, чтобы получить то, что вы хотите.

SYSTEM_INFO структура:

wProcessorArchitecture
Архитектура процессора установленной операционной системы.

1 голос
/ 11 июля 2014

Вот еще один способ: GetSystemWow64Directory - «Извлекает путь к системному каталогу, используемому WOW64. Этот каталог отсутствует в 32-битной Windows».и «В 32-битной Windows эта функция всегда дает сбой, а расширенная ошибка установлена ​​на ERROR_CALL_NOT_IMPLEMENTED».

Лично я не уверен в использовании IsWow64Process, поскольку в MSDN в описании IsWow64Process есть текст «Обратите внимание, что этот метод не является надежным способом определения того, является ли операционная система64-разрядная версия Windows, поскольку Kernel32.dll в текущих версиях 32-разрядной Windows также содержит эту функцию. "

1 голос
/ 10 августа 2011

Вы можете запустить команду Windows systeminfo как процесс в вашей программе.

#include <stdlib.h>

system("systeminfo");

Одной из возвращаемых категорий является тип системы.

Его вывод гласит: System Type: x86-based PCили System Type: x64-based PC

Возможно, это более сложное решение, чем решение, предоставленное другими, но я подумал, что добавлю его как возможность.(Возможно, вам нужна дополнительная информация.)

0 голосов
/ 04 февраля 2014
 static bool is64bitOS()
   {
      SYSTEM_INFO si;
      GetSystemInfo(&si);

      if((si.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_IA64)||(si.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_AMD64)==64)
      {
         return true;
      }
      else
      {
         return false;
      }

   }
0 голосов
/ 10 августа 2011

Простая проверка: если EXE не запускается, то это 64-разрядный исполняемый файл, работающий на 32-разрядной машине. На 64-битной машине всегда будет выполняться 32-битный исполняемый файл.

От Microsoft ,

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

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

Однако в Windows вы также можете проверить наличие папки Program Files (x86) в качестве еще одной простой проверки. Не нужно фантазировать.

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