Sur un système Windows 64 bits, la lecture des diverses variables d'environnement et de certaines clés du Registre Windows est redirigé à différentes sources, selon que le processus effectuant la lecture est de 32 ou 64 bits.
Le tableau ci-dessous énumère ces sources de données :
X = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion
Y = HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion
Z = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
READING ENVIRONMENT VARIABLES: Source for 64-bit process Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
%ProgramFiles% : X\ProgramW6432Dir X\ProgramFilesDir (x86)
%ProgramFiles(x86)% : X\ProgramFilesDir (x86) X\ProgramFilesDir (x86)
%ProgramW6432% : X\ProgramW6432Dir X\ProgramW6432Dir
%CommonProgramFiles% : X\CommonW6432Dir X\CommonFilesDir (x86)
%CommonProgramFiles(x86)% : X\CommonFilesDir (x86) X\CommonFilesDir (x86)
%CommonProgramW6432% : X\CommonW6432Dir X\CommonW6432Dir
%ProgramData% : Z\ProgramData Z\ProgramData
READING REGISTRY VALUES: Source for 64-bit process Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
X\ProgramFilesDir : X\ProgramFilesDir Y\ProgramFilesDir
X\ProgramFilesDir (x86) : X\ProgramFilesDir (x86) Y\ProgramFilesDir (x86)
X\ProgramFilesPath : X\ProgramFilesPath = %ProgramFiles% Y\ProgramFilesPath = %ProgramFiles(x86)%
X\ProgramW6432Dir : X\ProgramW6432Dir Y\ProgramW6432Dir
X\CommonFilesDir : X\CommonFilesDir Y\CommonFilesDir
X\CommonFilesDir (x86) : X\CommonFilesDir (x86) Y\CommonFilesDir (x86)
X\CommonW6432Dir : X\CommonW6432Dir Y\CommonW6432Dir
Ainsi, par exemple, pour un processus de 32 bits, la source des données pour le processus de %ProgramFiles%
y %ProgramFiles(x86)%
variables d'environnement est la valeur du registre HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
.
Cependant, pour un processus 64 bits, la source des données de l'indicateur %ProgramFiles%
La variable d'environnement est la valeur du registre HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir
...et la source des données pour la %ProgramFiles(x86)%
La variable d'environnement est la valeur du registre HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
La plupart des installations Windows par défaut mettent une chaîne comme C:\Program Files (x86)
dans la valeur du registre HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
mais cela (et d'autres) peut être changé.
Tout ce qui est saisi dans ces valeurs du registre Windows sera lu par l'Explorateur Windows dans les variables d'environnement respectives lors de la connexion, puis copié dans tout processus enfant qu'il génère ensuite.
La valeur du registre HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesPath
est particulièrement remarquable parce que la plupart des installations Windows mettent la chaîne de caractères %ProgramFiles%
en elle, pour être lue par les processus 64 bits. Cette chaîne fait référence à la variable d'environnement %ProgramFiles%
qui, à son tour, tire ses données de la valeur du registre HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir
...à moins qu'un programme ne change la valeur de cette variable d'environnement apriori.
J'ai écrit un petit utilitaire, qui affiche ces variables d'environnement pour les processus 64 bits et 32 bits. Vous pouvez le télécharger aquí .
Le code source de VisualStudio 2017 est inclus et les exécutables binaires 64 et 32 bits compilés se trouvent dans les répertoires suivants ..\x64\Release
y ..\x86\Release
respectivement.
11 votes
Je pense que la vraie question est la suivante : pourquoi n'existe-t-il pas une version de %programfiles% qui pointe toujours vers x86 à la fois sur Windows 7 et Windows xp pour simplifier l'exécution des programmes qui sont installés sur les deux ? Par exemple, après avoir installé Debugging Tools for Windows (x86) sur XP, il se trouve dans Program Files mais sur Windows 7, il se trouve dans Program Files (x86), ce qui signifie qu'il n'y a pas de %programfiles%. simple pour créer un fichier de commande qui peut être distribué sur tous les ordinateurs, car aucune des variables d'environnement intégrées ne pointe systématiquement vers l'emplacement 32 bits de Program Files.
0 votes
[IMHO, un point qui manque dans cette discussion est que, quelle que soit la variable que vous utilisez, il est garanti qu'elle pointe toujours vers le dossier approprié. Ceci devient critique dans les rares cas où Windows est installé sur un lecteur autre que C:\.