web-dev-qa-db-fra.com

Détecter 32 ou 64 bits de Windows

Je veux détecter si le système d'exploitation Windows actuel est 32 bits ou 64 bits. Comment y parvenir en utilisant C++? Je ne veux pas le type de processeur, je veux le type de bit du système d'exploitation. En effet, vous pouvez installer un système d'exploitation 32 bits sur un processeur 64 bits.

45
Rahul

La fonction à appeler est IsWow64Process ou IsWow64Process2 . Il indique à votre application 32 bits si elle s'exécute sur un Windows 64 bits.

Si le programme est compilé pour 64 bits, il le saura déjà.

44
Bo Persson

Si votre code est en 64 bits et en cours d'exécution, Windows est en 64 bits - rien à vérifier. Si votre processus est un appel 32 bits IsWow64Process() - Les processus 32 bits s'exécutent dans WOW64 sur Windows 64 bits et sans WOW64 sinon.

16
sharptooth
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
}
11
Survarium

vous pouvez utiliser IsWow64Process si votre application est une application 32 bits, s'il est vrai que vous utilisez un système d'exploitation x64, sinon c'est 32 bits

7
Necrolis

Vous devez utiliser GetNativeSystemInfo . Étant donné que vous vous attendez à ce que cela fonctionne sur un système d'exploitation 32 bits, vous devez utiliser LoadLibrary + GetProcAddress pour pouvoir gérer cette fonction n'étant pas disponible. Donc, si cela échoue, vous savez que c'est un système d'exploitation 32 bits. Si non, SYSTEM_INFO.wProcessorArchitecture vous donne le type de processeur réel au lieu de celui émulé.

5
Hans Passant

Utilisez la fonction GetNativeSystemInfo . Il obtient un LPSYSTEM_INFO paramètre pour obtenir ce que vous voulez.

SYSTEM_INFO structure:

wProcessorArchitecture
L'architecture du processeur du système d'exploitation installé.

3
Hayri Uğur Koltuk

Vous pouvez exécuter la commande Windows systeminfo en tant que processus dans votre programme.

#include <stdlib.h>

system("systeminfo");

L'une des catégories renvoyées est le type de système.

Sa sortie indique: System Type: x86-based PC, ou System Type: x64-based PC

Cela peut être une solution plus compliquée que celle fournie par d'autres, mais j'ai pensé que je l'ajouterais comme une possibilité. (Peut-être que vous recherchez également des informations supplémentaires.)

1
sealz

Voici une autre façon: GetSystemWow64Directory - "Récupère le chemin du répertoire système utilisé par WOW64. Ce répertoire n'est pas présent sur Windows 32 bits." et "Sous Windows 32 bits, la fonction échoue toujours et l'erreur étendue est définie sur ERROR_CALL_NOT_IMPLEMENTED. "

Personnellement, je ne suis pas sûr de l'utilisation de IsWow64Process puisque dans MSDN dans la description du IsWow64Process il y a le texte "Notez que cette technique n'est pas un moyen fiable de détecter si le système d'exploitation est une version 64 bits de Windows car le Kernel32.dll dans les versions actuelles de Windows 32 bits contient également cette fonction."

1
user3759036