Я хочу определить, является ли текущая ОС Windows 32-разрядной или 64-разрядной. Как достичь этого с помощью С++? Я не хочу, чтобы тип процессора я хотел использовать бит бит. Это связано с тем, что вы можете установить 32-разрядную ОС на 64-разрядный процессор.
Обнаружение 32-разрядных или 64-разрядных окон
Ответ 1
IsWow64Process
функция - это IsWow64Process
или IsWow64Process2
. Он сообщает вашему 32-битному приложению, работает ли оно на 64-битной Windows.
Если программа скомпилирована для 64 бит, она уже будет знать.
Ответ 2
Если ваш код 64-разрядный и работает, то Windows 64-бит - ничего не проверять. Если ваш процесс представляет собой 32-битный вызов IsWow64Process()
- 32-разрядные процессы запускаются в WOW64 в 64-разрядной Windows и без WOW64 в противном случае.
Ответ 3
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
}
Ответ 4
вы можете использовать IsWow64Process, если ваше приложение представляет собой 32-битное приложение, если оно истинно, вы работаете на ОС x64, иначе это 32bit
Ответ 5
Вам нужно использовать GetNativeSystemInfo
. Учитывая, что вы ожидаете, что это будет работать в 32-битной операционной системе, вам нужно использовать LoadLibrary
+ GetProcAddress
, чтобы вы могли справиться с этой функцией, недоступной. Поэтому, если это не удается, вы знаете, что это 32-разрядная операционная система. Если нет, SYSTEM_INFO.wProcessorArchitecture
дает вам реальный тип процессора вместо эмулируемого.
Ответ 6
Используйте GetNativeSystemInfo
. Он получает параметр LPSYSTEM_INFO
, чтобы получить то, что вы хотите.
SYSTEM_INFO
Структура:
wProcessorArchitecture
Архитектура процессора установленной операционной системы.
Ответ 7
Вы можете запустить команду windows systeminfo
как процесс в вашей программе.
#include <stdlib.h>
system("systeminfo");
Одной из возвращаемых категорий является Тип системы.
Его вывод: System Type: x86-based PC
или System Type: x64-based PC
Это может быть более сложное решение, чем предложение других, но я думал, что добавлю его как возможность. (Возможно, вы тоже за дополнительной информацией.)
Ответ 8
Вот еще один способ: GetSystemWow64Directory - Извлекает путь к системному каталогу, используемому WOW64. Этот каталог отсутствует на 32-битном Окна ". и" В 32-разрядной Windows функция всегда терпит неудачу, а расширенная ошибка установлена на ERROR_CALL_NOT_IMPLEMENTED
".
Я лично не уверен в использовании IsWow64Process
, так как в MSDN в описании IsWow64Process
есть текст "Обратите внимание, что этот метод не является надежным способом определить, является ли операционная система 64- разрядной версии Windows, потому что Kernel32.dll в текущих версиях 32-разрядной Windows также содержит эту функцию."
Ответ 9
Простая проверка - если EXE не запускается, то это 64-разрядный исполняемый файл, запущенный на 32-разрядной машине. 64-разрядная машина всегда будет запускать 32-разрядный исполняемый файл.
Из Microsoft,
Большинство программ, предназначенных для 32-разрядной версии Windows, будут 64-разрядная версия Windows. Известными исключениями являются многие антивирусы программы.
Драйверы устройств, предназначенные для 32-разрядной версии Windows, не работают на компьютерах с 64-разрядной версией Windows. Если вы пытаетесь установить принтер или другое устройство, в котором есть только 32-разрядные драйверы доступный, он не будет работать корректно в 64-разрядной версии Windows.
Однако в Windows вы также можете проверить наличие папки Program Files (x86) в качестве еще одной простой проверки. Не нужно проявлять фантазию.
Ответ 10
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;
}
}