Registre Windows 64 bits vs registre 32 bits

J’ai entendu sur 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 accéder à l’application x86 et l’autre pour accéder à l’application x64? Par exemple, si un COM enregistre CLSID dans le jeu de registre x86, alors l’application x64 ne pourra jamais accéder au composant COM par CLSID, car x86 / x64 possède différents jeux de registre?

Donc, ma question est de savoir si ma compréhension de l’échantillon ci-dessus est correcte? Je souhaite également obtenir d’autres documents pour apprendre ce sujet, à propos des deux ensembles de registres différents sur l’architecture x64. (J’ai fait des recherches, mais je n’ai trouvé aucune information précieuse.)

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 un ordinateur 64 bits, ses clés de registre sont situées 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 comstackz votre application en tant que fichier binary 64 bits et l’exécutez sur un ordinateur 64 bits, les clés de registre se trouvent à l’emplacement ci-dessus. Cependant, si vous comstackz votre application en tant que fichier binary 32 bits et que vous l’exécutez sur un ordinateur 64 bits, vos informations de registre se trouvent maintenant ici:

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

Cela signifie que si vous exécutez à la fois les versions 32 bits et 64 bits de votre application sur le même ordinateur, ils examineront chacun un ensemble différent de clés de registre.

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

Si vous voulez créer un composant à utiliser à la fois par x86 et x64, vous devez créer une paire de DLL une pour x86 et une autre pour x64 et vous enregistrer dans les parties appropriées du registre. Le fichier regsrv32.exe situé dans le dossier System32 enregistre de manière perverse le composant x64 et le fichier regsrv32.exe du dossier SysWOW64 enregistre le composant x86.

Vous pouvez également créer un assembly .NET pour tout processeur pouvant être utilisé par l’une ou l’autre architecture du processeur.

Ce ne sont pas des registres distincts – l’un est un sous-noeud de l’autre et le système d’exploitation fait de la virtualisation pour s’assurer que les applications 32 bits reçoivent leurs clés et que les applications 64 bits obtiennent leurs clés.

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

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

Je lance une machine x64 bits en tant que poste de travail; et je n’ai jamais rencontré de problème avec les différentes configurations de registre.

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

HTH

Comment enregistrer l’assembly .NET à utiliser comme COM dans une application 64 bits pure?

Problème: Par défaut, si vous activez “S’enregistrer pour COM Interop” dans les parameters de construction, 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 procédez comme suit:

 cd c:\windows\microsoft.net\framework64\v2.x.xxxxx regasm /codebase "path to your comstackd assembly dll" 

Cela éliminera “Class Not Registered Error” lors de l’utilisation de C ++ natif pour installer l’assembly .NET en tant qu’object COM.