c++ - software - Detecta Windows de 32 bits o 64 bits
windows 32 bits o 64 bits (10)
Quiero detectar si el sistema operativo Windows actual es de 32 bits o de 64 bits. ¿Cómo lograrlo usando C ++? No quiero el tipo de procesador. Quiero el tipo de bit del SO. Esto se debe a que puede instalar un sistema operativo de 32 bits en un procesador de 64 bits.
Aquí hay otra forma: GetSystemWow64Directory : "Recupera la ruta del directorio del sistema utilizado por WOW64. Este directorio no está presente en Windows de 32 bits". y "En Windows de 32 bits, la función siempre falla y el error extendido se establece en ERROR_CALL_NOT_IMPLEMENTED
".
Personalmente no estoy seguro sobre el uso de IsWow64Process
ya que en MSDN en la descripción del IsWow64Process
aparece el texto "Tenga en cuenta que esta técnica no es una manera confiable de detectar si el sistema operativo es una versión de Windows de 64 bits porque Kernel32 .dll en las versiones actuales de Windows de 32 bits también contiene esta función ".
Necesita usar GetNativeSystemInfo
. Dado que espera que esto funcione en un sistema operativo de 32 bits, necesita usar LoadLibrary
+ GetProcAddress
para que pueda manejar esta función que no está disponible. Entonces, si eso falla, sabrá que es un sistema operativo de 32 bits. De lo contrario, SYSTEM_INFO.wProcessorArchitecture
le proporciona el tipo de procesador real en lugar del emulado.
Puede ejecutar el comando de Windows systeminfo
como un proceso en su programa.
#include <stdlib.h>
system("systeminfo");
Una de las categorías que regresan es Tipo de sistema.
Su salida dice: System Type: x86-based PC
, o System Type: x64-based PC
Esta puede ser una solución más complicada que la proporcionada por otros, pero pensé que lo agregaría como una posibilidad. (Quizás también esté buscando información adicional).
Si su código es de 64 bits y se está ejecutando, Windows es de 64 bits, no hay nada que ver. Si su proceso es de 32 bits, llame a IsWow64Process()
: los procesos de 32 bits se ejecutan en WOW64 en Windows de 64 bits y sin WOW64 de lo contrario.
Una simple comprobación es si el EXE no se ejecuta, entonces es un ejecutable de 64 bits que se ejecuta en una máquina de 32 bits. Una máquina de 64 bits siempre ejecutará un ejecutable de 32 bits.
De Microsoft ,
La mayoría de los programas diseñados para la versión de 32 bits de Windows funcionarán en la versión de 64 bits de Windows. Excepciones notables son muchos programas antivirus.
Los controladores de dispositivo diseñados para la versión de 32 bits de Windows no funcionan en equipos con una versión de Windows de 64 bits. Si intenta instalar una impresora u otro dispositivo que solo tenga disponibles controladores de 32 bits, no funcionará correctamente en una versión de Windows de 64 bits.
En Windows, sin embargo, también puede verificar la existencia de la carpeta Archivos de programa (x86) como otra verificación simple. No es necesario ser elegante.
Use la función GetNativeSystemInfo
. Obtiene un parámetro LPSYSTEM_INFO
para obtener lo que desea.
Estructura SYSTEM_INFO
:
wProcessorArchitecture
La arquitectura del procesador del sistema operativo instalado.
puede usar IsWow64Process() si su aplicación es de 32 bits, si es cierto que se está ejecutando en un sistema operativo x64, sino que es de 32 bits
La función para llamar es IsWow64Process
. Le dice a su aplicación de 32 bits si se está ejecutando en un Windows de 64 bits.
Si el programa está compilado para 64 bits, ya lo sabrá.
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;
}
}
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
}