web-dev-qa-db-fra.com

Registre Windows 64 bits vs. Registre 32 bits

J'ai entendu parler de l'architecture Windows x64, afin de prendre en charge l'exécution des applications x86 et x64, il existe deux ensembles distincts/différents de registre Windows - un pour l'application x86 et l'autre pour l'application x64. Par exemple, si un COM enregistre CLSID dans l'ensemble de registres x86, l'application x64 ne pourra jamais accéder au composant COM par CLSID, car x86/x64 ont des ensembles de registres différents?

Donc, ma question est de savoir si ma compréhension de l'exemple ci-dessus est correcte? Je veux également obtenir plus de documents pour apprendre ce sujet, sur les deux différents ensembles de registres sur l'architecture x64. (J'ai fait quelques recherches, mais je n'ai trouvé aucune information précieuse.)

41
George2

J'ai rencontré ce problème il n'y a pas longtemps. La réponse courte est que si vous exécutez une application 32 bits sur une machine 64 bits, ses clés de registre se trouvent sous un Wow6432Node.

Par exemple, supposons que vous ayez une application qui stocke ses informations de registre sous:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX

Si vous compilez votre application en tant que binaire 64 bits et l'exécutez sur une machine 64 bits, les clés de registre se trouvent à l'emplacement ci-dessus. Cependant, si vous compilez votre application en tant que binaire 32 bits et l'exécutez sur une machine 64 bits, vos informations de registre se trouvent maintenant ici:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX

Cela signifie que si vous exécutez les versions 32 bits et 64 bits de votre application sur la même machine, elles examineront chacune un ensemble différent de clés de registre.

57
17 of 26

Votre compréhension est correcte. Il n'y aurait pas besoin d'une application x64 pour accéder aux CLSID x86 car elle ne pourrait jamais charger ces composants de toute façon et vice versa.

Si vous souhaitez créer un composant à utiliser à la fois par x86 et x64, vous devez soit créer une paire de DLL, l'une conçue pour x86 et l'autre pour x64, et les enregistrer dans leurs parties appropriées du registre. Le regsrv32.exe dans le dossier System32 enregistrera de façon perverse le composant x64 et le regsrv32.exe dans le dossier SysWOW64 enregistrera le composant x86.

Vous pouvez également créer un assemblage .NET pour n'importe quel processeur pouvant être utilisé par l'une ou l'autre architecture de processeur.

7
AnthonyWJones

Ce ne sont pas des registres séparés - l'un est un sous-nœud de l'autre, et le système d'exploitation fait de la virtualisation pour s'assurer que les applications 32 bits obtiennent leurs clés et les applications 64 bits obtiennent leurs clés.

4
i_am_jorf

Comment enregistrer l'assembly .NET à utiliser en tant que COM dans une application 64 bits pure?

Problème: Par défaut, si vous activez "Register for COM Interop" dans les paramètres de génération, il n'enregistre PAS la bibliothèque de types pour 64 bits.

Solution: Pour enregistrer votre assembly qui n'est pas dans GAC sur une machine 64 bits, ouvrez la fenêtre cmd et faites:

cd c:\windows\Microsoft.net\framework64\v2.x.xxxxx
regasm /codebase "path to your compiled Assembly dll"

Cela éliminera "Erreur de classe non enregistrée" lors de l'utilisation de C++ natif pour instancier l'assembly .NET en tant qu'objet COM.

1
Kashif Mushtaq

J'exécute une machine x64 bits comme bureau; et je n'ai jamais rencontré de problème avec les différentes configurations de registre.

Par MSDN, il y a apparemment une différence: http://msdn.Microsoft.com/en-us/library/ms724072 (VS.85) .aspx

HTH

1
Nate

Voici l'article Wikipedia sur le registre WOW64 qui peut vous fournir certaines des informations que vous recherchez:

http://en.wikipedia.org/wiki/WOW64

1
Brawndo