2012-03-26 20 views
19

Tenemos un proyecto que se compila en una DLL COM de 32 bits y una DLL COM de 64 bits (la misma de my earlier question). Cuando me registro en mi máquina con Windows 7, ambos se registran correctamente. Cuando me registro en un equipo con Windows Server 2003, ambos se registran correctamente.DLL de 32 bits "puede no ser compatible" en Server 2008, pero funciona en Server 2003

Pero cuando trato de registrar los archivos DLL en un servidor Windows 2008 R2 máquina estándar SP1, el archivo DLL de 64 bits se registra con éxito, pero la DLL 32 bits falla con el mensaje (sic):

El módulo ""% 1 "" puede no ser compatible con la versión de Windows que está ejecutando. Compruebe si el módulo es compatible con una versión x86 (32 bits) o x64 (64 bits) de regsvr32.exe.

No creo que una DLL de 32 bits pueda ser compatible con WS2003 y Win7 pero no WS2008. Eso no tiene sentido.

¿Qué podría estar pasando?

+1

Esto puede ser una pregunta tonta, pero si tiene una versión tanto de 32 bits como de 64 bits de su ensamblado, ¿por qué está intentando registrar la versión de 32 bits en un sistema operativo de 64 bits? – NotMe

+5

Esta podría ser una pregunta más tonta, pero ¿por qué hay un error gramatical en el mensaje de error? ¿Se supone que eso sugiere alguna situación FU a la mano? – arsaKasra

+2

Para responder la primera pregunta tonta: Aseguramiento de la calidad. Como los archivos DLL de 32 bits son compatibles con Windows de 64 bits, debemos asegurarnos de que nuestra DLL de 32 bits funcione en esa situación. –

Respuesta

13

La versión de Regsvr32.exe debe coincidir con la de 32-64 bits del dll que está intentando registrar. El regsvr32 de 64 bits no puede cargar un dll de 32 bits, y viceversa.

Es posible que necesite llamar explícitamente a la versión de 32 bits de regsrv32 ubicada en% systemroot% \ SysWoW64 \ regsvr32.exe.

De http://support.microsoft.com/kb/249873

Regsvr32.exe se incluye con Microsoft Internet Explorer 3.0 o versiones posteriores, Windows 95 OEM Service Release 2 (OSR2) o versiones posteriores, y Windows NT 4.0 Service Pack 5 (SP5) o versiones posteriores . Regsvr32.exe se instala en la carpeta Sistema (Windows Me/Windows 98/Windows 95) o System32 (Windows NT/Windows XP/Windows Vista/Windows 7).

Nota En una versión de 64 bits de un sistema operativo Windows, hay dos versiones del archivo: Regsv32.exe

  • La versión de 64 bits es% SystemRoot% \ System32 \ regsvr32.exe.
  • La versión de 32 bits es% systemroot% \ SysWoW64 \ regsvr32.exe.

uso de Regsvr32.exe RegSvr32.exe tiene las siguientes opciones de línea de comandos: Regsvr32 [/ u] [/ n] [/ i [: cmdline]] dllname

/u - Eliminar el registro del servidor /i - Llamar a DllInstall pasándole una [cmdline] opcional; cuando se usa con/u calls dll uninstall /n - no llame a DllRegisterServer; esta opción se debe usar con/i /s - Silencio; no mostrar cuadros de mensaje (agregado con Windows XP y Windows Vista) Cuando usa Regsvr32.exe, intenta cargar el componente y llamar a su función DLLSelfRegister. Si este intento es exitoso, Regsvr32.exe muestra un cuadro de diálogo que indica éxito. Si el intento no tiene éxito, Regsvr32.exe devuelve un mensaje de error. Esto puede incluir un código de error Win32.Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base: 193625 Códigos de error de WinInet (12001 a 12156)

+2

La versión de 64 bits de regsvr32 puede delegar en la versión de 32 bits para (des) registrar archivos DLL de 32 bits, y viceversa. Lo que es más probable es que WOW64 no esté instalado en absoluto. Comenzando con Windows Server 2008 R2, WOW64 ahora es un componente opcional. –

+1

¡Es bueno saberlo, gracias! :) – nullforce

+3

Ya hemos intentado utilizar SysWOW64 \ regsvr32 para registrar la DLL de 32 bits y eso trae el mismo error. –

2

Lo recibí registrado moviendo el archivo dll a c: \ windows \ syswow64 \ directorio (que no funcionaría en el directorio system32) y luego una llamada explícita a syswow64 \ regsvr32, por ejemplo

c: \ windows \ SysWOW64 \ regsvr32 yourdll.dll

por cierto que no funcionaría cuando se llama a c: \ windows \ syswow64 \ regsvr32 c: \ windows \ syswow64 \ yourdll.dll

6

Esto no es probable que b e el problema en su caso, pero puede ser útil para otros que encuentran esta pregunta buscando en el mismo mensaje de error:

Tuve un problema similar: una DLL que no se registraba con el de 32 bits o 64 versión de bit de RegSvr32. Cargué la DLL de Dependency Walker (depends.exe, http://www.dependencywalker.com/) y recibí un mensaje mucho más útil:

Error: Al menos un archivo no era un módulo de Windows de 32 bits o de 64 bits.

El escaneo de la columna de la CPU en la Lista de módulos identificó el módulo infractor. (En mi caso, decía "No se encontró ninguna firma de DOS o PE. Este archivo no es un módulo válido de Windows de 32 o 64 bits")

Moral: Dependency Walker podría darle un mensaje de error más útil que RegSvr32.exe.

+0

Esto mostró la fuente del problema para mí. Mi camino era tal que se estaba cargando un dll de 64 bits en lugar de la versión de 32 bits. – Armbie

1

que tienen el mismo problema, pero resolverlo con comandos

CD \ windows \ SysWOW64 regsvr32 c: \ nombre de archivo. dll

0

Usa Process Monitor desde SysInternals.

1. Filtrar por "Nombre del proceso" = regsvr32.exe. Filter

2. Intente registrar su dll desde la versión correcta de regsvr32.exe (la versión de 32 bits se encuentra en la carpeta SysWow64)

3. El monitor de procesos rastreará TODO lo que suceda en su computadora.

4. Primero comience su análisis eliminando los eventos de registro (por ahora) enter image description here

5. Es posible que puedas ver que dll se encuentra y no se encuentra.

Aquí una (muy) Captura de pantalla parcial de regsvr32.exe de Threed32.ocx donde podemos ver algunos de los DLL requerido enter image description here

6. Tu trabajo recién está comenzando. Desde ahora.

1

Ejecutando el símbolo del sistema como administrador solucionó mi problema.

Cuestiones relacionadas