Detecta Windows de 32 bits o 64 bits

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.

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 progtwig está comstackdo para 64 bits, ya lo sabrá.

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.

 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 } 

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

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.

Use la función GetNativeSystemInfo . Obtiene un parámetro LPSYSTEM_INFO para obtener lo que desea.

Estructura SYSTEM_INFO :

wProcessorArchitecture
La architecture del procesador del sistema operativo instalado.

Puede ejecutar el comando de Windows systeminfo como un proceso en su progtwig.

 #include  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).

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

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 progtwigs 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 progtwigs 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 progtwig (x86) como otra verificación simple. No es necesario ser elegante.

  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; } }