9
votes

Comment puis-je dire si je cours sur x64?

Je viens de recevoir un rapport de bogue pour un problème qui se produit uniquement lorsque le programme est en cours d'exécution "sur une machine 64 bits". Maintenant, Delphi ne produit pas de code 64 bits, tellement théoriquement qui ne devrait pas avoir d'importance, mais apparemment, cela fait dans ce cas. Je pense avoir une solution de contournement, mais cela brisera les choses sur des fenêtres 32 bits, alors j'ai besoin d'une certaine façon de dire:

  1. Si je cours sur un processeur x64 ou x86 et
  2. Si je cours sous une version 64 bits de Windows sous Win32 Emulation ou Native Win32 sur un système d'exploitation 32 bits.

    Est-ce que quelqu'un sait comment je peux obtenir ces réponses de mon application?


0 commentaires

6 Réponses :


3
votes

Vous pouvez vérifier l'existence d'après, puis appeler Iswow64Process . La page MSDN liée indique le code requis.


0 commentaires

21
votes

Mason, vous pouvez utiliser iswow64process (WOW64 est l'émulateur X86 qui permet aux applications Windows 32 bits de fonctionner de manière transparente sur des fenêtres 64 bits) xxx

bye.


2 commentaires

Est-ce que cela est autorisé par Windows 'UAC lors de l'exécution d'une application moyenne ou faible?


Je réponds à mon propre commentaire: Oui! parce que kernel32.dll fait partie de chaque processus DELPHI



-1
votes

si Tailleof (intPTR) == 8 Vous êtes une application 64 bits sur Windows 64 bits ( EDIT: s'applique uniquement Delphi Prism)

sinon si iswow64process < / code> réussit et retourne true , vous êtes une application 32 bits sur Windows 64 bits

sinon Vous êtes sur des fenêtres 32 bits


5 commentaires

La première partie n'est pas applicable, car Delphi ne compile pas les applications 64 bits.


Delphi Prism ne construit-il pas aux applications .NET à IL? :-)


Oui, mais Delphi et Delphi Prism sont deux langues différentes. Quand quelqu'un dit simplement "DELPHI", ils signifient généralement la version native.


Si nous allons à 128 bits à l'avenir, vous le détecterez comme x86 car ce n'est pas 8 octets.


@Remko Vous êtes techniquement correct, ma réponse échouera car il ne sait pas comment traiter> 64 bits OS. Encore une fois, il échouera en général de détecter s'il s'agit d'une application 128 bits, ou d'une application WOW 64 bits dans un système d'exploitation 128 bits, ou d'une application WOW 32 bits dans l'émulateur WOW 64 bits sur le système d'exploitation 128 bits de toute façon . Et je pense que vous seriez difficile de mettre à jour ma réponse pour la détection de toute application exécutée sur 128 bits du système d'exploitation, pour une raison simple, il n'y a pas de moyen correct de détecter quelque chose qui n'existe pas encore.



8
votes

Je vois votre question 2 (courez-vous sur Win64?) Est déjà répondu. N'oubliez pas que pour votre code, vous devez considérer que dans une application (hypothétique) 64 bits Delphi fonctionnant sur Win64, Iswow64Process retournerait également false.

En ce qui concerne votre première question - êtes-vous sur une CPU 64 bits -, vous pouvez vérifier le matériel pour le drapeau de fonctionnalité CPUID respectif, comme dans le code ci-dessous. p>

p>

xor eax,eax             //Setting EAX = input param for CPUID to 0
cpuid                   //Call CPUID.0
                        //Returns -> EAX = max "standard" EAX input value
mov esi, eax            //Saving MaxStdInput Value

mov eax,80000000h       //Setting EAX = input param for CPUID to $80000000
cpuid                   //Call CPUID.80000000h
                        //Returns -> EAX = max "extended" EAX input value
                        //If 80000000h call is unsupported (no 64-bit processor),
                        //cpuid should return the same as in call 0
cmp eax, esi
je @No64BitProcessor    //IF EAX{MaxExtInput} = ESI{MaxStdInput} THEN goto No64BitProcessor;

cmp eax, 80000001h
jb @No64BitProcessor    //IF EAX{MaxExtInput} < $80000001 THEN goto No64BitProcessor;

mov eax,80000001h       //Call $80000001 is supported, setting EAX:=$80000001
cpuid                   //Call CPUID.80000001h
                        //Checking "AMD long mode"/"Intel EM64T" feature bit (i.e., 64bit processor)
bt edx, 29              //by checking CPUID.80000001h.EDX[bit29]
setc al                 //IF Bit29=1 then AL{Result}:=1{true; it's a 64-bit processor}
jmp @Exit               //Exit {Note that Delphi may actually recode this as POP ESI; POP EBX; RET}


0 commentaires

2
votes

La page MSDN dit:

Pour la compatibilité avec les systèmes d'exploitation qui ne supportent pas cela fonction, appelez getprocAddress pour détecter si Iswow64Process est mis en œuvre dans kernel32.dll. Si GetProcaddress réussit, il est prudent de Appelez cette fonction. Sinon, WOW64 n'est pas présent. Notez que cela la 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 le kernel32.dll dans le courant Les versions de Windows 32 bits contiennent également cette fonction.

Ce qui signifie: Ceci est une nouvelle fonction et vous devez faire preuve de prudence de manière stachée.


0 commentaires

0
votes

Au début de la première fonction, vous devez ajouter

if SizeOf(Pointer)=8 then
  Exit(True); // Current app is 64 bit


1 commentaires

La question concerne la façon de savoir si le système d'exploitation Windows est 64 bits, non si l'application est de 64 bits.