Pourquoi les DLL 64 bits vont-elles vers System32 et les DLL 32 bits vers SysWoW64 sur Windows 64 bits?

Je voudrais savoir quand faut-il placer un fichier sous

C:WindowsSystem32 ou C:WindowsSysWOW64, sur un système Windows 64 bits.

J'avais deux DLL, une pour 32 bits, une pour 64 bits.

Logiquement, je pensais placer la DLL 32 bits sous C:WindowsSystem32, et la DLL 64 bits sous C:WindowsSysWOW64.

À ma grande surprise, c'est l'inverse! Le 32-peu un va dans C:WindowsSysWOW64, et le 64-bits DLL va dans C:WindowsSystem32.

Des trucs très déroutants. Quelle est la raison derrière tout cela?

207
demandé sur Vertexwahn 2009-06-04 15:30:43

4 réponses

Je crois que l'intention était de renommer System32, mais tant d'applications codées en dur pour ce chemin, qu'il n'était pas possible de le supprimer.

SysWoW64 n'était pas destiné aux dll des systèmes 64 bits, c'est en fait quelque chose comme "Windows sur Windows64", ce qui signifie les bits dont vous avez besoin pour exécuter des applications 32 bits sur un windows 64 bits.

Cet article, explique une peu:

" Windows x64 a un répertoire System32 qui contient des dll 64 bits (sic!). Ainsi les processus natifs avec un bitness de 64 trouver" leurs " dll où ils les attendent: dans le dossier System32. Un deuxième répertoire, SysWOW64, contient les DLL 32 bits. Le redirecteur du système de fichiers fait la magie de cacher le vrai répertoire System32 pour les processus 32 bits et d'afficher SysWOW64 sous le nom de System32."

Edit: si vous parlez d'un programme d'installation, Vous ne devrait pas codez en dur le chemin d'accès au dossier système. Au lieu de cela, laissez Windows s'en occuper pour vous selon que votre le programme d'installation s'exécute sur la couche d'émulation.

208
répondu Rytmis 2018-03-14 20:48:22

Je devrais ajouter: vous ne devriez pas mettre vos dll dans \system32\ de toute façon! Modifiez votre code, modifiez votre programme d'installation... trouvez une maison pour vos bits qui N'est nulle part sous c:\windows\

Par exemple, votre programme d'installation place vos DLL dans:

\program files\<your app dir>\

or

\program files\common files\<your app name>\

(Note: La façon dont vous pouvez faire cette est d'utiliser l'environnement var: %ProgramFiles% ou % ProgramFiles (x86)% pour trouver où se trouve Program Files.... vous ne supposez pas que c'est le cas c:\program fichiers\ ....)

Et puis définit une balise de registre:

HKLM\software\<your app name>
-- dllLocation

Le code qui utilise vos DLL lit le Registre, puis des liens dynamiques vers les DLL à cet emplacement.

Ce qui précède est la façon intelligente d'aller.

Vous n'installez jamais vos dll, ou des DLL tierces dans \system32 \ ou \ syswow64. Si vous devez charger statiquement, vous mettez vos DLL dans votre répertoire exe (où elles seront trouvées). Si vous ne pouvez pas prédire le répertoire exe (par exemple, un autre exe va appeler votre dll), vous devrez peut-être mettre votre répertoire dll dans le chemin de recherche (évitez cela si possible!)

System32 et syswow64 sont pour les fichiers fournis par Windows... pas pour tout le monde elses fichiers . La seule raison pour laquelle les gens ont pris la mauvaise habitude de mettre des choses là-bas est parce qu'il est toujours dans le chemin de recherche, et de nombreuses applications/modules utilisent des liens statiques. (Donc, si vous y arrivez vraiment, le vrai péché est la liaison statique - c'est un péché dans le code natif et le code géré - toujours Toujours toujours dynamiquement lien!)

21
répondu Jonesome 2016-06-14 16:06:57

A rencontré le même problème et a fait des recherches pendant quelques minutes.

on m'a appris à utiliser Windows 3.1 et DOS, rappelez-vous ces jours-là? Peu de temps après avoir travaillé avec des ordinateurs Macintosh strictement pendant un certain temps, puis a commencé à se balancer vers Windows après l'achat d'une machine x64 bits.

Il y a des raisons réelles derrière ces changements (certains diraient une signification historique), qui sont nécessaires pour que les programmeurs continuent leur travail.

La Plupart des changements sont mentionnés ci-dessus:

  • Program Files vs Program Files (x86)

    au début, les fichiers 16/86bit ont été écrits sur des processeurs Intel' 86'.

  • System32 que signifie vraiment System64 (sur Windows 64 bits)

    Lorsque les développeurs ont commencé à travailler avec Windows7, il y avait plusieurs problèmes de compatibilité où d'autres applications étaient stockées.

  • SysWOW64 que signifie vraiment SysWOW32

    Essentiellement, en anglais simple, cela signifie 'Windows sur Windows dans un 64-bit la machine'. Chaque dossier indique où se trouvent les DLL pour les applications qu'ils souhaitent utiliser.

Voici deux liens avec toutes les informations de base dont vous avez besoin:

J'espère que cela éclaircit les choses!

5
répondu Crispy 2013-07-29 18:08:39

System32 est l'endroit où Windows a historiquement placé toutes les DLL 32 bits, et le système était pour les DLL 16 bits. Lorsque microsoft a créé le système d'exploitation 64 bits, tout le monde que je connais s'attendait à ce que les fichiers résident sous System64, mais Microsoft a décidé qu'il était plus logique de mettre des fichiers 64 bits sous System32. Le seul raisonnement que j'ai pu trouver, c'est qu'ils voulaient que tout ce qui était 32bit fonctionne dans un Windows 64bit sans avoir à changer quoi que ce soit dans les programmes-il suffit de recompiler, et c'est fait. La façon dont ils résolu cela, de sorte que les applications 32 bits pouvaient encore fonctionner, était de créer un sous-système windows 32 bits appelé Windows32 sur Windows64. En tant que tel, L'acronyme SysWOW64 a été créé pour le répertoire système du sous-système 32 bits. Le Sys est l'abréviation de System, et WOW64 est l'abréviation de Windows32OnWindows64.
Étant donné que windows 16 est déjà séparé de Windows 32, Il n'y avait pas besoin D'une équivalence Windows 16 sur Windows 64. Dans le sous-système 32 bits, quand un programme va utiliser des fichiers du system32 en fait, ils obtiennent les fichiers du répertoire SysWOW64. Mais le processus est défectueux.

C'est une conception horrible. Et dans mon expérience, j'ai dû faire beaucoup plus de changements pour écrire des applications 64 bits, que simplement changer le répertoire System32 pour lire System64 aurait été un très petit changement, et que les directives pré-compilateur sont destinées à gérer.

3
répondu Armand 2016-06-14 23:18:40