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

Je voudrais savoir quand faut-il placer un fichier sous

C: \ Windows \ System32 ou C: \ Windows \ SysWOW64, 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: \ Windows \ System32 et la DLL 64 bits sous C: \ Windows \ SysWOW64.

À ma grande surprise, c’est l’inverse ! Celui de 32 bits passe dans C: \ Windows \ SysWOW 64 et la DLL de 64 bits dans C: \ Windows \ System 32 .

Des choses très déroutantes. Quelle est la raison derrière cela?

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

SysWoW64 n’était pas conçu pour les DLL des systèmes 64 bits, il s’agit en fait de “Windows sur Windows 64”, ce qui signifie que vous devez exécuter des applications 32 bits sur une fenêtre 64 bits.

Cet article explique un peu:

“Windows x64 a un répertoire System32 contenant des DLL 64 bits (sic!). Ainsi, les processus natifs avec un bit 64 trouvent” leurs “DLL là où ils les attendent: dans le dossier System32. Un second répertoire, SysWOW64, contient les 32 -bit DLL Le redirecteur du système de fichiers fait la magie de masquer le véritable répertoire System32 pour les processus 32 bits et d’afficher SysWOW64 sous le nom de System32. ”

Edit: Si vous parlez d’un installateur, vous ne devriez pas coder en dur le chemin d’access au dossier système. Au lieu de cela, laissez Windows s’en charger pour vous selon que votre programme d’installation s’exécute ou non sur la couche d’émulation.

Je devrais append: Vous ne devriez pas mettre votre dll dans \ system32 \ de toute façon! Modifiez votre code, modifiez votre installateur … trouvez une maison pour vos bits qui ne se trouve nulle part sous c: \ windows \

Par exemple, votre installateur met vos DLL dans:

 \program files\\ or \program files\common files\\ 

( Remarque : la manière de procéder consiste à utiliser l’environnement var:% ProgramFiles% ou% ProgramFiles (x86)% pour trouver où Program Files est …. vous ne supposez pas qu’il s’agit de c: \ program files \ .. ..)

puis définit une balise de Registre:

 HKLM\software\ -- dllLocation 

Le code qui utilise vos DLL lit le registre, puis se connecte dynamicment aux DLL de cet emplacement.

Ce qui précède est la façon intelligente de procéder.

Vous n’installez jamais vos DLL ou les DLL tierces dans \ system32 \ ou \ syswow64. Si vous devez charger statiquement, vous placez 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 ceci si vous le pouvez!)

system32 et syswow64 sont pour les fichiers fournis par Windows … pas pour les autres fichiers . La seule raison pour laquelle les gens ont pris la mauvaise habitude de mettre des choses là-bas, c’est qu’elles sont 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 managé – toujours toujours un lien dynamic!)

Ran dans le même problème et fait des recherches pendant quelques minutes.

On m’a appris à utiliser Windows 3.1 et DOS, rappelez-vous ces jours? Peu de temps après avoir travaillé avec des ordinateurs Macintosh pendant un certain temps, j’ai commencé à revenir à Windows après avoir acheté 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 poursuivent leur travail.

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

  • Program Files vs Program Files (x86)

    Au début, les fichiers 16/86 bits étaient écrits sur des processeurs Intel «86».

  • System32 signifie vraiment System64 (sous Windows 64 bits)

    Lorsque les développeurs ont commencé à travailler avec Windows 7, il y avait plusieurs problèmes de compatibilité pour lesquels d’autres applications étaient stockées.

  • SysWOW64 signifie vraiment SysWOW32

    Essentiellement, en clair, cela signifie «Windows sur Windows dans une machine 64 bits» . Chaque dossier indique l’emplacement des DLL pour les applications qu’ils souhaitent utiliser.

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

  • Redirecteur de système de fichiers MSDN

  • SysWow64 expliqué

Espérons que cela arrange les choses!

System32 est l’endroit où Windows plaçait historiquement toutes les DLL 32 bits et où System était pour les DLL 16 bits. Lorsque Microsoft a créé le système d’exploitation 64 bits, tous ceux que je connais s’attendaient à ce que les fichiers résident sous System64, mais Microsoft a décidé qu’il était plus judicieux de placer des fichiers 64 bits sous System32. Le seul raisonnement que j’ai pu trouver, c’est qu’ils voulaient que tout ce qui était 32 bits fonctionne dans un Windows 64 bits sans avoir à changer quoi que ce soit dans les programmes – il suffit de recomstackr, et c’est fait. La façon dont ils ont résolu ce problème, de sorte que les applications 32 bits puissent toujours fonctionner, était de créer un sous-système Windows 32 bits appelé Windows32 On Windows64. En tant que tel, l’acronyme SysWOW64 a été créé pour le répertoire System du sous-système 32 bits. Le Sys est l’abréviation de System et WOW64 est l’abréviation de Windows32OnWindows64.
Windows 16 étant déjà séparé de Windows 32, il n’y avait pas besoin d’équivalence Windows 16 On Windows 64. Dans le sous-système 32 bits, lorsqu’un programme utilise des fichiers du répertoire system32, il récupère les fichiers du répertoire SysWOW64. Mais le processus est défectueux.

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