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 ?
4 Réponses :
non, cela ne peut pas fonctionner comme une vérification em> em>, car 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> 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.
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 )
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?
En outre, on peut utiliser iswow64process A > Pour vérifier si vous êtes un processus de 32 bits ( Tailleof (void *) == 4 code>) exécuté sous l'émulation WOW64 sur une machine Windows 64 bits. P>
Le compilateur ne sait pas. Au moins pas si vous souhaitez savoir si vous utilisez des fenêtres de 64 bits.
Je pense que chacun répond à un autre côté de la question: +1.
Le compilateur ne sait pas si l'application est exécutée sur une machine 64 bits.
Chez Docs: "Si le processus est une application 64 bits exécutée sous Windows 64 bits, la valeur est également définie sur False." Cela signifie-t-il que mon programme pensera à ses fenêtres 32 bits maintenant si je le compile sur 64 bits et exécutez-le sur une machine de 64 bits? Je ne comprends pas ce que le point retourne faux dans ce cas ... BTW Je ne veux pas que le compilateur sache, je dois vérifier le temps d'exécution.
Si vous compilez 64bits, tailleOf (void *) == 8 code> est titulaire. Dans ce cas, il n'est pas nécessaire d'appeler
iswow64process code>.
@John - Oui, il le sait, il génère un code 64 bits. Un programme contenant du code de machine de 64 bits est garanti de ne pas fonctionner sur un système d'exploitation 32 bits.
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 }
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
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. " P>
Je pense que vous avez mal compris. Ils faisaient référence à la vérification si iswow64process code> est présent ou non comme un moyen de détecter la buté. Vous devez également l'appeler.
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.