182 votes

Pourquoi Windows 64 bits a-t-il besoin d'un dossier "Program Files (x86)" distinct ?

Je sais que sur une version 64 bits de Windows, le dossier "Program Files" est destiné aux programmes 64 bits et le dossier "Program Files (x86)" est destiné aux programmes 32 bits, mais pourquoi est-ce nécessaire ?

Par "nécessaire", je ne veux pas dire "pourquoi Microsoft n'aurait-il pas pu prendre d'autres décisions de conception", car bien sûr, il aurait pu le faire. Je veux plutôt dire "pourquoi, compte tenu de la conception actuelle de Windows 64 bits, les programmes 32 bits doivent-ils avoir un dossier de premier niveau distinct de celui des programmes 64 bits ?". En d'autres termes, "que se passerait-il si j'évitais d'une manière ou d'une autre le mécanisme de redirection et que je forçais tout à s'installer dans le vrai C:\Program Files\ ?"

Il y a beaucoup de questions sur Super User et ailleurs qui affirment "l'un est pour les programmes 32 bits, l'autre pour les programmes 64 bits", mais aucune que j'ai pu trouver n'en donne la raison. D'après mon expérience, ce n'est pas semblent peu importe qu'un programme 32 bits soit installé au bon endroit ou non.

Windows se présente-t-il différemment pour un programme exécuté à partir de "Program Files (x86)" ? Existe-t-il une description qui montre exactement ce qui est différent pour un programme installé dans "Program Files (x86)" au lieu de "Program Files" ? Je pense qu'il est peu probable que Microsoft introduise un nouveau dossier sans une raison technique légitime.

0 votes

En plus de tout cela, il se peut que vous installiez à la fois des versions 32 et 64 bits de certaines applications (par exemple Internet Explorer)... donc, la création d'un dossier de premier niveau différent éviterait le désordre des dlls et des exes...

0 votes

> puisque vous pouvez facilement exécuter n'importe quelle application à partir de n'importe quel dossier sans connaître son architecture @Sklivvz, bien sûr que vous pouvez, l'architecture est évidente lorsque vous lisez l'en-tête PE.

6voto

La raison en est de faciliter la mise à niveau d'un programme vers le 64 bits pour les développeurs. Ils n'ont pas besoin d'écrire de code personnalisé pour vérifier si le programme se trouve dans un répertoire lors de la compilation en mode 32 bits et dans un autre répertoire lors de la compilation en mode 64 bits ; ils vérifient simplement que C:\Program Files et lorsqu'il est exécuté en mode 32 bits, il est automatiquement modifié en C:\Program Files (x86) par Windows 64 bits. De même, les entrées du registre sont isolées entre les programmes 32 bits et 64 bits.

Cela permet d'éviter les conflits causés par des développeurs inconscients qui se contentent de changer leur mode de compilation en 64 bits sans y réfléchir, et évite une énorme quantité de travail aux développeurs qui souhaitent que les utilisateurs puissent installer simultanément les versions 32 et 64 bits de leurs logiciels.


Mais pourquoi un programme voudrait-il permettre l'installation simultanée des deux versions ? Un exemple : Photoshop et IE ont des extensions qui sont des .dll natives. Il n'est pas possible de mélanger les codes 32 et 64 bits dans le même processus, de sorte qu'un module complémentaire pour la version 32 bits ne peut pas être utilisé avec la version 64 bits, et vice-versa. Ainsi, Photoshop/IE ont de permettre l'installation des deux versions, sous peine de briser leur énorme base d'addons existants.

2 votes

+1 Au moins, vous avez abordé la question sous-jacente de savoir pourquoi les utilisateurs moyens auraient les deux versions.

5voto

Enjoy coding Points 1050

Les programmes qui s'exécutent dans "Program Files(x86)" utilisent l'option de l'utilisateur. WOW64 (Windows 32 bits sur Windows 64 bits est un ensemble de pilotes et d'API destinés à exécuter des applications x32 sur un système d'architecture x64) :

Le sous-système WoW64 comprend une couche de compatibilité légère qui a des interfaces similaires sur toutes les versions 64 bits de Windows. Il vise à créer un environnement 32 bits qui fournit les interfaces nécessaires pour exécuter des applications Windows 32 bits non modifiées sur un système 64 bits. Techniquement, WoW64 est mis en œuvre à l'aide de trois bibliothèques à liaison dynamique (DLL) :

  • Wow64.dll, l'interface centrale du noyau Windows NT qui assure la conversion entre les appels 32 bits et 64 bits, y compris la manipulation des pointeurs et de la pile d'appels. d'appel
  • Wow64win.dll, qui fournit les points d'entrée appropriés pour les applications 32 bits.
  • Wow64cpu.dll, qui se charge de faire passer le processeur du mode 32 bits au mode 64 bits

Les systèmes 64 bits doivent "émuler" les applications 32 bits, c'est la raison pour laquelle Windows doit "séparer" deux dossiers Program Files.

7 votes

Mais pourquoi doit-il le mettre dans des dossiers différents ? Windows est déjà parfaitement capable de déterminer l'architecture d'un exécutable en regardant l'en-tête PE. Pourquoi ne peut-il pas charger l'environnement approprié lorsqu'il charge l'exécutable ?

1 votes

Je pense que c'est juste un choix de Microsoft pour montrer facilement aux utilisateurs quelle architecture ils veulent à partir de deux versions de programme lors de l'ouverture d'un programme. Je veux dire, s'il n'y avait pas ces deux dossiers et si c'était transparent pour les utilisateurs (si ça changeait automatiquement), ils ne sauraient pas s'ils utilisent une application 32 ou 64 bits, et même, ils ne sauraient pas quel programme ouvrir s'il fonctionne en 64 bits

1 votes

Si l'utilisateur est un novice, je doute fort qu'il utilise les deux versions. En fait, même les utilisateurs avancés utilisent rarement les versions 32 bits et 64 bits d'un programme. Si une version 64 bits est disponible et que le système est 64 bits, alors les personnes (saines d'esprit) sont censées utiliser la version 64 bits ; il n'y a aucune excuse raisonnable pour installer ou exécuter la version 32 bits, à moins d'être un développeur et de faire des tests. Bien sûr, si la version 64 bits est expérimentale, on peut s'attendre à ce que les non-développeurs/testers utilisent uniquement la version 32 bits et la désinstallent lorsque la version 64 bits est prête.

5voto

Il est intéressant de constater que les réponses données ici et sur Internet varient considérablement. Trouver une réponse précise à cette question importante a été un défi. Il semble qu'il y ait beaucoup de fausses informations présentées sur Internet, ce qui entraîne une certaine confusion.

J'ai effectué un grand nombre de recherches et j'ai tiré la conclusion suivante, qui me semble exacte :

  • L'endroit où une application est stockée ne fait aucune différence. Au moment de l'exécution, Windows déterminera si l'application est 32 ou 64 bits et utilisera automatiquement les DLL et la section de registre appropriées.

Cette opération est automatique et indépendante de l'endroit où l'application est stockée. Il n'y a aucun avantage en termes de vitesse, de fiabilité ou d'autres avantages fonctionnels à avoir des dossiers 32 bits et 64 bits séparés.

La seule raison de la séparation par défaut en deux dossiers ("Program Files" et "Program Files (x86)") est que si vous avez deux versions du même programme (une version 32 bits et une version 64 bits), cela fournit un moyen simple de séparer les fichiers qui se chevauchent. Même dans ce cas, tant que tous les noms de fichiers sont uniques, ils peuvent exister dans le même dossier sans aucune conséquence.

Il y a un bémol à la conclusion ci-dessus, et c'est celui des applications mal codées. Si une application contient des chemins codés en dur, elle n'utilisera que ce chemin. En règle générale, les chemins ne devraient jamais être codés en dur dans une application, mais il arrive qu'un programmeur fasse cette erreur. Dans ce cas, le programme utilisera le chemin codé en dur ; le répertoire dans lequel l'application est installée n'affectera pas l'endroit où elle recherche réellement les fichiers.

3voto

Dennis Points 46916

Le fait de séparer les dossiers permet de conserver les applications 64 bits natives et celles qui nécessitent l'utilisation de l'option d'extension. WoW64 à part.

Cela peut être utile - comme @OliverSalzburg déjà signalé - si vous souhaitez installer à la fois le 64 bits et le 32 bits d'un navigateur web (par exemple), car certains plug-ins et add-ons peuvent n'être disponibles que pour l'un des deux.

Le fait de devoir séparer les dossiers rend cette séparation automatique en utilisant des techniques telles que redirection du registre .

Supposons qu'un programme d'installation tente de déterminer le dossier des fichiers de programmes en lisant le registre en utilisant, par exemple, la commande suivante RegQueryValueEx .

Dans tous les cas, il essaie de lire la clé de registre

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

qui pointe normalement vers C:\Program Files .

Toutefois, si le programme d'installation est une application 32 bits, la redirection du registre fera en sorte que la clé de registre

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

à lire à la place, qui pointe normalement vers C:\Program Files (x86) .

Pourquoi ces particulier Les noms des dossiers qui ont été utilisés ne peuvent trouver de réponse que chez les personnes qui ont fait ce choix. Vous pouvez toujours changer les noms des dossiers par défaut si vous le souhaitez.

Est-ce que Windows se présente différemment pour un programme qui s'exécute à partir de "Program Files (x86)" ?

J'en doute. La plupart des installateurs vous permettent de choisir un dossier d'installation personnalisé, ce qui n'a pas vraiment d'importance. un programme est installé.

3voto

ryanwc Points 61

Je ne peux pas croire à la confusion qui règne ici Tout d'abord, je suis un développeur à plein temps.

MS a fait cela pour résoudre le cas où une DLL est utilisée à la fois par les anciennes applications 32 bits et les nouvelles applications 64 bits. L'ancienne méthode ne pouvait pas être modifiée (System32, Program Files, etc.) car cela aurait cassé les anciens programmes qui ne peuvent pas être recompilés.

MS a donc créé un dossier pour stocker les programmes, assemblages et bibliothèques spécifiques à 64 bits afin que les nouveaux programmes puissent se lier aux bibliothèques appropriées et que les anciens programmes continuent de fonctionner normalement.

À l'heure actuelle, les DLL .Net peuvent coexister avec d'autres versions sur la même machine. Par exemple, vous pouvez avoir Library.1.0.1, Library.1.0.2, Library 1.1.0, etc. Et ceci uniquement pour une taille de bit spécifique (32 ou 64). Si des dossiers séparés ne sont pas utilisés, alors chaque assemblage doit avoir une version 32 et 64 bits. Cela encombrerait gravement un répertoire qui contient déjà plusieurs versions du même assembly.

Ce sont tous des trucs de développeurs. En tant qu'utilisateur, je n'y suis confronté que lorsque je travaille avec un programme 32 bits sous Windows 7 64. Et je préfère avoir la possibilité d'exécuter une version 32 bits et la même application en 64 bits également. Lorsque je travaille sur une application 32 bits que je dois compiler en 64 bits, il me suffit de demander au compilateur de le faire. Les noms de Dll et tout le reste restent les mêmes.

La raison pour laquelle cela n'existait pas avec Windows 95/98 est que ces systèmes simulaient un runtime 32 bits ; ce n'était pas un véritable système d'exploitation 32 bits. Il simulait l'exécution 32 bits avec quelque chose appelé "thunking".

Voici une bonne définition : http://searchwinit.techtarget.com/definition/thunk

1 votes

Comment ProgramFiles(x86)` avoid clutter? There are still both 32- and 64-bit versions of files, so avoiding clutter doesn't make sense. There is no difference between putting them in \32\blah ` ou \blah\32 Dans les deux cas, ils sont séparés. En fait, la méthode actuelle sépare les composants de l'application (et les duplique inutilement, car peu d'applications utilisent des composants de l'application). CommonFiles pour les ressources et autres. De plus, vous donnez l'impression que les applications jettent leurs DLL dans un seau commun. Il est assez facile de garder les DLL 32 bits d'une application avec ses exes 32 bits et ses DLL 64 bits avec ses exes 64 bits.

0 votes

Oh, et pour ce qui est de 95/98, qui a dit quoi que ce soit à ce sujet ? Même XP avait un sous-système 16 bits (le NTVDM).

0 votes

Je pensais que tu voulais une explication. Peu d'applications utilisent CommonFiles ? J'ai 35 applications différentes qui y ont des entrées. C'est un endroit plus sûr pour stocker des composants partagés que le répertoire System32. Votre affirmation que peu d'applications l'utilisent est discutable. Je vous cite : "Ils n'ont pas eu à sauter à travers ces cerceaux pour permettre des programmes 32 bits et 16 bits sur le même système. Je ne me rappelle pas avoir jamais vu un ProgramFiles (16) ou quelque chose comme ça [...] La partie sur le fait que cela a été fait comme une commodité pour les programmeurs est raisonnable cependant." Eh bien, oui... les programmeurs le font. Nous écrivons les applications après tout.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X