2009-05-15 16 views
37

Escuché en la arquitectura Windows x64, para admitir la ejecución de las aplicaciones x86 y x64, hay dos juegos de registros de Windows separados/diferentes: uno para la aplicación x86 y el otro para la aplicación x64. ¿acceso? Por ejemplo, si un COM registra CLSID en el conjunto de registros x86, entonces la aplicación x64 nunca podrá acceder al componente COM mediante CLSID, porque x86/x64 tiene diferentes conjuntos de registros.Registro de Windows de 64 bits v.s. Registro de 32 bits

Entonces, mi pregunta es si mi comprensión de la muestra anterior es correcta. También quiero obtener más documentos para aprender este tema, sobre los dos conjuntos diferentes de registro en la arquitectura x64. (He hecho un poco de búsqueda, pero no encontré ninguna información valiosa.)

gracias de antemano, George

Respuesta

52

Me encontré con este problema no hace mucho tiempo. La respuesta corta es que si ejecuta una aplicación de 32 bits en una máquina de 64 bits, sus claves de registro se encuentran debajo de un Wow6432Node.

Por ejemplo, digamos que usted tiene una aplicación que almacena su información de registro bajo:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX 

Si compila su aplicación como 64 bit binario y ejecutarlo en una máquina de 64 bits entonces las claves de registro son en el lugar de arriba Sin embargo, si se compila su aplicación como 32 bit binario y ejecutarlo en una máquina de 64 bits, entonces su información de registro se encuentra ahora aquí:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

Esto significa que si se ejecuta tanto en la versión de bits 32 bits y 64 de su aplicación en la misma máquina, cada uno de ellos examinará un conjunto diferente de claves de registro.

+2

Una pregunta rápida, si estoy usando regsvr32 para registrar un componente COM, ¿cómo sabemos si nos registramos bajo el registro x86 o x64? Mi opinión es que, si está registrado en el registro x86, la aplicación x64 no podrá acceder al componente COM. – George2

+7

Hay dos versiones de regsrv32 en una máquina de 64 bits. Uno registra binarios de 64 bits y uno registra binarios de 32 bits en el nodo Wow6432. Este artículo de Microsoft kb podría ser útil para usted: http://support.microsoft.com/kb/282747 –

+0

1. cuando registramos un nuevo componente COM utilizando regsvr32 de 32 bits, el componente COM debe construirse para x86 (cuando registrar un nuevo componente COM usando 64-bit regsvr32, el componente COM debe ser construido para x64) - significa que no podemos usar 32-bit regsvr32 para registrar componente COM de 64-bit (o usando 64-bit regsvr32 para registrar 32-bit Componente COM), ¿correcto? 2. El proceso de 64 bits solo podía acceder al registro x64 para COM CLSID, y el proceso de 32 bits solo podía acceder al registro x86 para COM CLISD, sin acceso cruzado. Mi comprensión es correcta? – George2

1

Aquí está el artículo de Wikipedia sobre el registro WOW64 que le puede dar algo de la información que están buscando:

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

+0

Supongamos que tengo una aplicación .Net creada para Cualquier CPU, y la ejecuto en x64, entonces debería estar JIT para acceder a la versión x64 del registro, es decir, los CLSID de COM registrados bajo el registro x64, y si registro un 32- componente COM bit, la aplicación .Net no podrá encontrarlo? Mi comprensión es correcta? – George2

6

Tu conocimiento es el correcto. No habría ninguna necesidad de una aplicación x64 para acceder a los CLSID x86, ya que nunca podría cargar esos componentes de todos modos y viceversa.

Si desea crear un componente para ser usado por x86 y x64, entonces necesita crear un par de dlls, uno para x86 y el otro para x64 y registrar ambos en sus partes apropiadas del registro. El archivo regsrv32.exe en la carpeta System32 registrará perversamente el componente x64 y regsrv32.exe en la carpeta SysWOW64 registrará el componente x86.

Como alternativa, cree un ensamblado .NET para cualquier CPU que pueda ser utilizada por cualquiera de las arquitecturas de la CPU.

+0

@AnthonyWJones, estoy interesado en la .Net Cualquier muestra de CPU que ha mencionado. Supongamos que tengo una aplicación .Net creada para Cualquier CPU, y la ejecuto en x64, entonces debería estar JIT para acceder a la versión x64 del registro, es decir, los CLSID de COM registrados bajo el registro x64. Mi comprensión es correcta? – George2

+1

En ese escenario no es JIT o .NET que decide qué parte del registro buscar CLSID es el hecho de que el proceso en el que se está ejecutando el código es de 64 bits, que determina qué conjunto utilizará para buscar los CLSID. Esto es algo que sucede automáticamente dentro de las bibliotecas de soporte COM instaladas en Windows. – AnthonyWJones

+0

1. cuando registramos un nuevo componente COM utilizando regsvr32, ¿lo registramos bajo el registro x86 o bajo el registro x64 o bajo ambos? 2. Según tengo entendido, el proceso de 64 bits solo podría acceder al registro x64 para COM CLSID, y el proceso de 32 bits solo podría acceder al registro x86 para COM CLISD, sin acceso cruzado. Mi comprensión es correcta? – George2

4

No son registros separados: uno es un subnodo del otro, y el sistema operativo realiza la virtualización para garantizar que las aplicaciones de 32 bits obtengan sus claves y las aplicaciones de 64 bits obtengan sus claves.

+0

¿Alguna lectura recomendada para un principiante de este tema? – George2

+1

El artículo de MSND publicado anteriormente es probablemente el mejor lugar para comenzar. http://msdn.microsoft.com/en-us/library/ms724072.aspx –

+0

Una pregunta rápida, si estoy usando regsvr32 para registrar un componente COM, ¿cómo sabemos si registramos el componente COM en x86 o x64? ¿registro? Mi confusión es que, si está registrado en el registro x86, ¿la aplicación x64 no podrá acceder al componente COM? – George2

1

¿Cómo registrar el ensamblado .NET para ser utilizado como COM en la aplicación pura de 64 bits?

Problema: Por defecto, si habilita "Registrar para interoperabilidad COM" en la configuración de generación, ésta no registra la biblioteca de tipos de 64 bits.

Solución: para registrar su conjunto que no está en GAC en una máquina de 64 bits, la ventana cmd abierto y hacer:

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

Esto eliminará "Clase no registrada Error" cuando se utiliza nativa C++ para instanciar el ensamblado de .NET como objeto COM.

+0

Esto es precisamente lo que estaba causando la falla de mi aplicación de modo mixto de 64 bits: Visual Studio 2010 estaba registrando los ensamblados de 32 bits. En lugar de Registrar para interoperabilidad COM, puse los eventos de compilación de post a regasm como se indicó anteriormente (con/TLB generación en mi caso). ¿Hay algún artículo de MSDN relacionado con este comportamiento? – DaBozUK

Cuestiones relacionadas