Windows de 64 bits del registro de v. s. Registro de 32 bits

He escuchado en Windows de 64 bits de la arquitectura, con el fin de apoyar a ejecutar tanto en x86 y x64 de la aplicación, hay dos separados/conjuntos diferentes de registro de Windows, una para x86 aplicación para el acceso y el otro para la aplicación de 64 bits para el acceso? Por ejemplo, si un COM registros CLSID en el x86 conjunto de registro, luego de la aplicación de 64 bits nunca será capaz de acceder a la componente de COM CLSID, porque x86/x64 tienen diferentes conjuntos de registro?

Así, mi pregunta es si mi comprensión del ejemplo anterior es correcto? También quiero conseguir algunos documentos para aprender este tema, acerca de los dos conjuntos diferentes de registro en la arquitectura x64. (Hice algunas búsquedas, pero no se ha encontrado ninguna información valiosa.)

InformationsquelleAutor George2 | 2009-05-15

6 Kommentare

  1. 57

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

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

    HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX
    

    Si se compila la aplicación como un ejecutable de 64 bits y ejecutarlo en una máquina de 64 bits, a continuación, las claves del registro están en la ubicación anterior. Sin embargo, si usted compilar su aplicación como un programa de 32 bits binarios y ejecutarlo en una máquina de 64 bits, a continuación, su información de registro se encuentra ahora aquí:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX
    

    Esto significa que si ejecuta la versión de 32 bits y 64 bits versiones de su aplicación en la misma máquina, a continuación, van a ser cada uno mirando a un conjunto diferente de las claves del registro.

    • Una pregunta rápida, si estoy usando regsvr32 para registrar un componente COM, ¿cómo podemos saber si nos registrar bajo x86 o x64 de registro? Mi ocnfusion es, si está registrado bajo x86 registro, aplicación de 64 bits no será capaz de acceder a la componente COM?
    • Hay dos versiones de regsrv32 en una máquina de 64 bits. Uno de los registros de 64 bits binarios y uno de los registros de 32 bits binarios en el Wow6432 nodo. Este artículo de Microsoft kb podrían ser útiles para usted: support.microsoft.com/kb/282747
    • 1. cuando se registra un nuevo componente COM usando 32 bits regsvr32, el componente COM debe ser construido para x86 (cuando se registra un nuevo componente COM de 64 bits regsvr32, el componente COM debe ser construido para x64) – significa que no podemos usar 32 bits regsvr32 para registrar 64 bits componente COM (o de 64 bits regsvr32 para registrar de 32 bits componente de COM), ¿correcto? 2. Proceso de 64 bits sólo podía acceder a las x64 registro para CLSID COM, y el proceso de 32 bits sólo podía acceder x86 registro para COM CLISD, no la cruz de acceso. Mi entendimiento correcto?
    • Ese es mi entendimiento de la misma, pero yo no ofrecen garantías :). Yo sólo se aborda en este paso una vez hace un par de meses.
    • si puedo desarrollar componente COM nativo dirigidos para x86 de usuario y x64 usuario, entonces tengo que dar dos diferentes generaciones (x86 construir y x64 construir)? No hay manera de salvar mi trabajo, dándoles no sólo a construir para los nativos de construir y apto tanto para x86/x64?
    • De 32 bits binarios va a trabajar en ambas plataformas, pero si usted desea específicamente para ofrecer una versión de 64 bits de su binario entonces sí, usted necesita para construir uno para cada plataforma.

  2. 7

    Su comprensión es correcta. No habría ninguna necesidad de una x64 aplicación para acceder a los x86 Clsid ya que nunca podría carga de los componentes de todos modos, y viceversa.

    Si quieres crear un componente para el uso por parte de x86 y x64 entonces usted necesita para crear un par de archivos dll, construida para x86 y el otro para x64 y registrar tanto en sus partes correspondientes del registro. El regsrv32.exe en la carpeta System32 le perversamente registrar el x64 y el componente de la regsrv32.exe en la carpeta SysWOW64 registrará el x86 componente.

    Alternativamente construir una .NETO de la asamblea para Cualquier CPU que puede ser usado por cualquiera de arquitectura de la CPU.

    • Estoy interesado en el .Neto de la CPU de la muestra que usted ha mencionado. Supongamos que tengo una .Net aplicación diseñada para Cualquier CPU, y ejecutar en x64, entonces debe ser JITed para acceder a la versión x64 de registro, es decir, los Clsid de COM registrada bajo x64 registro? Mi entendimiento correcto?
    • En ese escenario no JIT o .NETA que decide qué parte del registro para buscar Clsid es el hecho de que el proceso en el que se ejecuta el código es de 64 bits que determinar qué conjunto se va a utilizar para buscar Clsid. Esto es algo que ocurre de forma automática dentro de la COM de apoyo a las bibliotecas instaladas en windows.
    • 1. cuando se registra un nuevo componente COM utilizando regsvr32, ¿tenemos que registrar en x86 registro o bajo x64 registro o en los dos? 2. Mi comprensión es, de proceso de 64 bits sólo podía acceder a las x64 registro para CLSID COM, y el proceso de 32 bits sólo podía acceder x86 registro para COM CLISD, no la cruz de acceso. Mi entendimiento correcto?
    • No queda claro si se va a crear un componente COM o intento de uso de una? Mi referencia .NETO se refiere a la habilidad para crear un ensamblado dll que va a trabajar en una de 32 bits o 64 bits proceso. Estás en lo correcto un proceso de 64 bits no se puede cargar una dll de 32 bits y viceversa.
    • Lo siento, no he estado a mi pregunta claramente. Permítanme decir una vez más en algunas de las otras palabras. 🙂 Por un componente COM nativo, si es x86, entonces se debe registrar en x86 registro utilizando la versión x86 de regsvr32, si es x64, entonces se debe registrar en x64 de registro utilizando la versión de 64 bits de regsvr32. Y no es todo en una sola versión de los nativos componente COM que se ajustan para x86/x64, por lo que nos puede registrarse una vez y x86/x64 proceso de carga de la en-proc componente COM. Mi entendimiento correcto?
    • si puedo desarrollar componente COM nativo dirigidos para x86 de usuario y x64 usuario, entonces tengo que dar dos diferentes generaciones (x86 construir y x64 construir)? No hay manera de salvar mi trabajo, dándoles no sólo a construir para los nativos de construir y apto tanto para x86/x64?

  3. 4

    No son registros separados: uno es un subnodo de la otra, y hace el sistema operativo de virtualización para asegurarse de que las aplicaciones de 32 bits obtener sus claves y 64 bits, las aplicaciones de sus claves.

    • El MSND artículo publicado anteriormente es probablemente el mejor lugar para empezar. msdn.microsoft.com/en-us/library/ms724072.aspx
    • Una pregunta rápida, si estoy usando regsvr32 para registrar un componente COM, ¿cómo podemos saber si vamos a registrar el componente COM en x86 o x64 de registro? Mi confusión es, si está registrado bajo x86 registro, aplicación de 64 bits no será capaz de acceder a la componente COM?
    • Así, es por eso que quiero saber si se está registrado bajo x86 o x64. Creo que, cuando se registra utilizando regsvr32, se registra bajo x86 o x64, no bajo tanto?
    • Sí, generalmente sólo se registra como uno, ya que su control será en una DLL de 32 bits o 64 bits DLL, y que no puede cargar una de 32 bits de control en un proceso de 64 bits (y viceversa). Así que usted probablemente desea registrar el uno de 32 bits y la de 64 bits uno por separado. Sin embargo, nunca he hecho esto, así que no estoy seguro si esa es la forma correcta de hacerlo o no…
    • Por lo tanto, si quiero construir un componente COM para ambas proceso de 32 bits y de 64 bits de proceso a utilizar, me tengo que registrar dos veces y la construcción de dos componente COM — x86 construir y x64 crear y registrar un bajo x64 registro y el otro registrada bajo x86 registro?
    • cuando se registra un nuevo componente COM usando 32 bits regsvr32, el componente COM debe ser construido para x86 (cuando se registra un nuevo componente COM de 64 bits regsvr32, el componente COM debe ser construido para x64) – significa que no podemos usar 32 bits regsvr32 para registrar 64 bits componente COM (o de 64 bits regsvr32 para registrar de 32 bits componente de COM), ¿correcto?
    • Nota: no es virtualización que está pasando aquí es redirección. Si una de 32 bits componente intenta leer un valor de registro HKEY_LOCAL_MACHINE\SOFTWARE\Google es silencio redirigido a HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Google
    • Matt, sí, estás en lo correcto. Que es lo que quiero decir. Gracias por aclarar lo de arriba.

  4. 1

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

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

    • Supongamos que tengo una .Net aplicación diseñada para Cualquier CPU, y ejecutar en x64, entonces debe ser JITed para acceder a la versión x64 de registro, es decir, los Clsid de COM registrada bajo x64 registro, y si me registro de 32 bits componente COM, el .Neto de la aplicación no será capaz de encontrarlo? Mi entendimiento correcto?
  5. 1

    De cómo registrarse .NETO de la asamblea para ser utilizado como COM en pura aplicación de 64 bits?

    Problema:
    De forma predeterminada, si se habilita «Registrar para Interoperabilidad COM» en la configuración de generación, NO registrar la biblioteca de tipo para 64 bits.

    Solución:
    Para registrar su asamblea, que no está en el GAC en una máquina de 64 bits, abra la ventana de cmd y hacer:

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

    Esto eliminará la «Clase No Registrada Error» cuando el uso de C++ nativo de instancias .NETO de la asamblea como objeto COM.

    • Esto es precisamente lo que estaba causando mi 64 bits en modo mixto de aplicaciones a fallar – las asambleas de 32 bits com registrados por Visual Studio 2010. Así que en lugar de Registrar para interoperabilidad COM, puse el post a la generación de eventos para regasm como arriba (con /TLB generación en mi caso). Hay un artículo de MSDN relacionados con este comportamiento?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea