% ProgramFiles% différences sur Windows 64 bits

8

À partir d'une invite de commande, j'obtiens ce qui suit:

>echo %ProgramFiles%
C:\Program Files

Cependant, certaines applications (PHP dans ce cas, bien que j'aie vu le même comportement depuis httpd.conf d'Apache), c'est:

>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)

Pourquoi est-ce?

Contexte: Je suis en train de développer des scripts qui sont indépendants du système d'exploitation hôte 32 bits ou 64 bits, et pour les fichiers de configuration, cela fonctionne très bien. Sur un système 32 bits, se %ProgramFiles%trouve "C: \ Program Files", et sur un système 64 bits, ce même résultat %ProgramFiles%semble être le même C:\Program Files (x86). Je suis simplement curieux de savoir pourquoi il n'en va pas de même lorsque je l'essaie à partir de l'invite de commande Windows (ou dans la barre d'explorateur, etc.). Y a-t-il une invite de commande 64 bits ou quelque chose?

ken
la source
Dans les deux environnements, %programfiles%renvoie C:\Program Files(sur une configuration par défaut de Windows). Sur les versions x64 de Windows, %programfiles(x86)renvoie C:\Program Files (x86). Vous ne savez pas pourquoi php renvoie quelque chose de contraire à cela, mais vous pouvez facilement vérifier ce que les variables d'environnement pour un système donné sont définies en exécutant à setpartir d'une invite de commande sur Windows x64 et Windows x86.
MDMarra

Réponses:

12

Lorsqu'une application 32 bits lancée dans un Windows 64 bits traite les variables d'environnement système% ProgramFiles% ou% commonprogramfiles%, le sous-système WoW64 remplace les valeurs de ces variables par les valeurs des variables% ProgramFiles (x86)% et "% commonprogramfiles (x86)%. Ainsi, par exemple,% ProgramFiles% sera ouvert en tant que "C: \ Program Files (x86)" lors de l'adressage à partir d'un programme 32 bits.

Ce comportement est déterminé par le système de redirection de registre qui offre une compatibilité descendante des logiciels 32 bits avec les systèmes d'exploitation 64 bits. L'environnement 32 bits est émulé pour les programmes 32 bits, même si les données auxquelles ils s'adressent se trouvent à un endroit différent.

Pour éviter une telle redirection dans un programme 32 bits, vous devez utiliser les variables d'environnement% programfiles% ou% COMMONPROGRAMFILES% (c'est-à-dire avec casse inverse) ou l'indicateur KEY_WOW64_64KEY lors de l'accès aux nœuds de registre correspondants.

justin0
la source
En fait, au lieu d'éviter la redirection, j'essaie de l'activer à partir d'une invite Windows; par exemple, j'aimerais pouvoir écrire un script %ProgramFiles%et le faire utiliser C:\Program Filessur 32 bits et pourtant l'utiliser C:\Program Files (x86)sur 64 bits. C'est la façon dont Apache et PHP fonctionnent, et même si je ne peux pas dire si c'est "correct", c'est un comportement astucieux. Par exemple, je peux définir ServerRoot "${ProgramFiles}\Zend\Apache2"dans httpd.conf, et il trouvera correctement l'installation de Zend / Apache (qui se trouve dans le dossier x86 sur 64 bits) quelle que soit la version de Windows.
ken
3
Sur ma machine, dans un shell de commande 32 bits, echo %programfiles%retourne toujours le chemin 32 bits. Il existe cependant une variable nommée ProgramW6432 qui pointe vers le chemin 64 bits.
Harry Johnston
Cela ne fonctionne pas pour moi. Toutes ces variables renvoient le même chemin: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati