43 votes

Registre Windows 64 bits par rapport au registre 32 bits

J'ai entendu dire que sur l'architecture Windows x64, afin de permettre l'exécution d'applications x86 et x64, il existe deux ensembles séparés/différents de registre Windows - l'un auquel les applications x86 ont accès et l'autre auquel les applications x64 ont accès ? Par exemple, si un COM enregistre le CLSID dans l'ensemble du registre x86, l'application x64 ne pourra jamais accéder au composant COM par le CLSID, car les ensembles de registres x86/x64 sont différents ?

Ma question est donc de savoir si ma compréhension de l'échantillon ci-dessus est correcte ? Je veux également obtenir d'autres documents pour apprendre ce sujet, sur les deux ensembles différents de registre sur l'architecture x64. (J'ai fait quelques recherches, mais je n'ai trouvé aucune information valable).

58voto

17 of 26 Points 15941

J'ai rencontré ce problème il n'y a pas longtemps. En résumé, 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, disons que vous avez 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. En revanche, si vous compilez votre application sous forme de binaire 32 bits et que vous l'exécutez sur une machine 64 bits, les informations du registre se trouvent 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, chacune d'entre elles consultera un ensemble différent de clés de registre.

2 votes

Une petite question, si j'utilise regsvr32 pour enregistrer un composant COM, comment savoir si nous enregistrons sous le registre x86 ou x64 ? Ma crainte est que, si l'enregistrement se fait sous le registre x86, l'application x64 ne pourra pas accéder au composant COM ?

7 votes

Il existe deux versions de regsrv32 sur une machine 64 bits. L'une enregistre les binaires 64 bits et l'autre enregistre les binaires 32 bits dans le nœud Wow6432. Cet article de Microsoft kb pourrait vous être utile : support.microsoft.com/kb/282747

0 votes

1. lorsque nous enregistrons un nouveau composant COM à l'aide de regsvr32 32 bits, le composant COM doit être construit pour x86 (lorsque nous enregistrons un nouveau composant COM à l'aide de regsvr32 64 bits, le composant COM doit être construit pour x64) -- cela signifie que nous ne pouvons pas utiliser regsvr32 32 bits pour enregistrer un composant COM 64 bits (ou utiliser regsvr32 64 bits pour enregistrer un composant COM 32 bits), correct ? 2. Le processus 64 bits ne peut accéder au registre x64 que pour COM CLSID, et le processus 32 bits ne peut accéder au registre x86 que pour COM CLISD, sans accès croisé. Ma compréhension est-elle correcte ?

7voto

AnthonyWJones Points 122520

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

Si vous voulez créer un composant utilisable à la fois par x86 et x64, vous devez créer une paire de dlls, l'une construite pour x86 et l'autre pour x64, et les enregistrer dans les parties appropriées du registre. Le fichier regsrv32.exe du dossier System32 enregistrera le composant x64 et le fichier regsrv32.exe du dossier SysWOW64 enregistrera le composant x86.

Vous pouvez également construire un assemblage .NET pour n'importe quelle unité centrale, qui peut être utilisé par l'une ou l'autre des architectures centrales.

0 votes

@AnthonyWJones, je suis intéressé par l'échantillon .Net Any CPU que vous avez mentionné. Supposons que j'ai une application .Net construite pour Any CPU, et que je l'exécute sur x64, alors elle devrait être JITée pour accéder à la version x64 du registre -- c'est-à-dire les CLSIDs de COM enregistrés dans le registre x64 ? Ma compréhension est-elle correcte ?

2 votes

Dans ce scénario, ce n'est pas le JIT ou .NET qui décide de la partie du registre où chercher les CLSID, mais le fait que le processus dans lequel le code s'exécute est en 64 bits, ce qui détermine le jeu qu'il utilisera pour chercher les CLSID. C'est quelque chose qui se produit automatiquement dans les bibliothèques de support COM installées dans Windows.

0 votes

1. Lorsque nous enregistrons un nouveau composant COM à l'aide de regsvr32, devons-nous l'enregistrer dans le registre x86 ou dans le registre x64 ou dans les deux ? 2. Si je comprends bien, le processus 64 bits ne peut accéder au registre x64 que pour COM CLSID, et le processus 32 bits ne peut accéder au registre x86 que pour COM CLISD, sans accès croisé. Ma compréhension est-elle correcte ?

4voto

jeffamaphone Points 31732

Il ne s'agit pas de registres distincts : l'un est un sous-noeud de l'autre, et le système d'exploitation effectue une virtualisation pour s'assurer que les applications 32 bits obtiennent leurs clés et les applications 64 bits les leurs.

1 votes

L'article du MSND publié ci-dessus est probablement le meilleur point de départ. msdn.microsoft.com/fr/us/library/ms724072.aspx

0 votes

Une petite question, si j'utilise regsvr32 pour enregistrer un composant COM, comment savoir si nous enregistrons le composant COM sous le registre x86 ou x64 ? Ma confusion est la suivante : si le composant est enregistré dans le registre x86, l'application x64 ne sera pas en mesure d'accéder au composant COM ?

0 votes

C'est pourquoi je veux savoir s'il est enregistré sous x86 ou x64. Je pense que lorsque nous l'enregistrons à l'aide de regsvr32, nous l'enregistrons sous x86 ou x64, et non sous les deux ?

1voto

Nate Points 14101

J'utilise une machine x64 bit comme bureau, et je n'ai jamais rencontré de problèmes avec les différentes configurations du registre.

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

HTH

1voto

Brawndo Points 436

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

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

0 votes

Supposons que j'ai une application .Net construite pour n'importe quelle unité centrale, et que je l'exécute sur x64, alors elle devrait être JITée pour accéder à la version x64 du registre -- c'est-à-dire les CLSID de COM enregistrés dans le registre x64, et si j'enregistre un composant COM 32 bits, l'application .Net ne sera pas en mesure de le trouver ? Ma compréhension est-elle correcte ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X