7
votes

Manière correcte de vérifier si Windows est 64 bits ou non, au moment de l'exécution? (C ++)

bool Win64bit = (sizeof(int*) == 8) ? 1 : 0;
I need this so my app can use Windows registry functions properly (or do i need?).So am i doing it right ?

5 commentaires

Aucun besoin réel de la partie "? 1: 0", si vous le collez dans un bool. (Je ne sais pas sur le reste.)


Évitez de contourner la virtualisation du registre, il est rarement nécessaire.


que veux-tu dire? Je veux être sûr que mon application puisse également utiliser le registre dans des fenêtres 64 bits aussi, c'est pourquoi j'ai besoin de savoir quelle version exécute mon programme, afin que je puisse choisir les fonctions de registre correctes (elles utilisent différentes fonctions pour 32 et 64 bits)


S'il vous plaît voir mon commentaire concernant la redirection du registre ci-dessous


"Bool Win64bit = (taille de (int *) == 8)? 1: 0;" Vous indique si le programme d'exécution est compilé à 64 bits ou non. Il ne vous indique pas la binosité du système d'exploitation Windows.


4 Réponses :


7
votes

non, cela ne peut pas fonctionner comme une vérification em> em>, car Tailleof (int *) code> est fixé au moment de la compilation au point où vous choisissez de compiler votre programme. comme 32 bits ou 64 bits, et une fois compilé, le chèque aura le même résultat fixe, quelle que soit la plate-forme que vous utilisez sur.

Cependant, puisqu'un programme 64 bits ne peut pas fonctionner sur un 32 bits plate-forme, vous constaterez que votre chèque fonctionne correctement sans modification em> en tant que vérification de la compilation: p>

Si vous compilez votre programme sous 64 bits, votre programme utilisera le 64- Bit API en raison de votre code ci-dessus et fonctionnera correctement sur une version 64 bits de Windows. Il ne parviendra pas à fonctionner sur des fenêtres 32 bits du tout, il n'y aura donc aucune chance que vous utilisez accidentellement l'API 64 bits sur une version 32 bits de Windows. P>

v++ platform == 32-bit => sizeof(int*) == 4 => use 32-bit API
AND
( windows platform == 64-bit => 32-bit API works using compatibility mode
  OR
  windows platform == 32-bit => 32-bit API works )


3 commentaires

J'ai juste besoin de savoir quelle des fonctions à utiliser RegDEleteKeyEx () ou RegDeleteKey () c'est pourquoi j'ai besoin de ce chèque. Également même si j'avais besoin d'une seule fonction, la fonction a encore besoin de valeur en fonction duquel système d'exploitation: key_wow64_32key ou key_wow64_644key ... donc je suis bloqué si je ne sais pas comment obtenir la version Windows.


@Newbie: Êtes-vous sûr de savoir que vous devez le savoir? Je veux dire, avez-vous vraiment besoin de supprimer WOW64_64_KEY? Parce que, sinon il convient de mentionner que WOW64 utilise un redirecteur de registre qui "isole des applications 32 bits et 64 bits en fournissant des vues logiques distinctes des parties clés du registre sur WOW64"


Oh, alors je pouvais simplement utiliser les fonctions de registre 32 bits de toute façon? et 64 bits Windows peut le gérer correctement?




15
votes

Voici ce que Raymond Chen suggère dans son blog à HTTPS: // Devblogs .microsoft.com / OldNewthing / 20050201-00 /? P = 36553 :

BOOL Is64BitWindows()
{
    #if defined(_WIN64)
        return TRUE;  // 64-bit programs run only on Win64
    #elif defined(_WIN32)
        // 32-bit programs run on both 32-bit and 64-bit Windows
        // so must sniff
        BOOL f64 = FALSE;
        return IsWow64Process(GetCurrentProcess(), &f64) && f64;
    #else
        return FALSE; // Win64 does not support Win16
    #endif
}


5 commentaires

Hmm qui a l'air bien, n'a pas compris la logique parfaitement, n'est pas le Bool F64 = Faux; inutile? ne devrait pas bool f64; être assez?


C'est des problèmes, Iswow64Process () n'est pas exporté par kernel32.dll sur des versions plus anciennes de Windows. Le programme ne fonctionnera pas. Utilisez getProcAddress ().


De quel point les versions parlez-vous? Win95? Win98?


@Newbie: Nobugz était raide, pour rendre le code ci-dessus, vous devez utiliser quelque chose comme: "Fniswow64Process = (lpfn_iswow64process) getProcAddress (getModulehandle (Texte (" Kernel32 "))," iSWOW64Process "); si (null! = Fniswow64process) { Si (! Fniswow64Process (getCurrentProcess (), & biswow64)) {// gérer l'erreur}} "


@Newbie: "Quel âge parlez-vous?" Il est exporté depuis WinXP SP2



0
votes

Voici un autre moyen: getSystemwow64Directory - "récupère le chemin du Répertoire système utilisé par wow64. Ce répertoire n'est pas présent sur des fenêtres 32 bits. " et "sur des fenêtres 32 bits, la fonction échoue toujours, et l'erreur étendue est définie sur error_call_not_implémented." À propos de Iswow64Processais Je ne suis personnellement pas sûr de l'utilisation de depuis dans MSDN dans la description de l'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 parce que Kernel32.dll dans les versions actuelles de Windows 32 bits contient également cette fonction. "


1 commentaires

Je pense que vous avez mal compris. Ils faisaient référence à la vérification si iswow64process est présent ou non comme un moyen de détecter la buté. Vous devez également l'appeler.