2011-08-25 13 views
35

Mover un proyecto de C# trabajando desde una ventana de 64 bits 7 máquina para una máquina de 32 bits XP causó el error siguiente:Cómo reparar el error COMException 80040154?

Retrieving the COM class factory for component with CLSID {681EF637-F129-4AE9-94BB-618937E3F6B6} failed due to the following error: 80040154.

681EF637-F129-4AE9-94BB-618937E3F6B6 no está en el registro por lo que no es correctamente instalado, pero esta es la misma identificación que anteriormente era un problema en la máquina de Windows 7 de 64 bits. La solución a este error en la máquina de 64 bits con Windows 7 se encontró here (cambie Platform Target a x86) pero esto no resuelve el problema en la máquina XP de 32 bits. ¿Cómo puedo encontrar el dll asociado con 681EF637-F129-4AE9-94BB-618937E3F6B6 o, mejor aún, cómo puedo reparar esta excepción?

+0

Hasta donde yo sé, no hay forma de que un proceso (64 o 32) cargue un dll de 32 bits (32 o 64 respectivamente). – Arun

+0

Tenga en cuenta que el código de error es REGDB_E_CLASSNOTREG. Entonces esto puede ocurrir cuando un control COM/ActiveX no está instalado en la máquina o no está instalado para la bitidez del proceso. –

Respuesta

20

Para encontrar la DLL, vaya a su máquina de 64 bits y abra el registro. Busque la clave llamada HKEY_CLASSES_ROOT\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32. Esta clave tendrá el nombre de archivo de la DLL como su valor predeterminado.

Si resolvió el problema en su máquina de 64 bits recompilando su proyecto para x86, entonces deberá buscar en la parte de 32 bits del registro en lugar de hacerlo en el lugar normal. Esto es HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32.

Si la DLL está construida para 32 bits, entonces puede usarla directamente en su máquina de 32 bits. Si está construido para 64 bits, deberá ponerse en contacto con el proveedor y obtener una versión de 32 bits de ellos.

Cuando tenga la DLL, regístrela ejecutando c: \ windows \ system32 \ regsvr32.exe.

11

Tuve el mismo problema en un servicio de Windows. Todas las claves están en el lugar correcto en el registro. La compilación del servicio se realizó para x86 y todavía tengo la excepción. Me enteré CorFlags.exe

Ejecutar esto en su service.exe sin banderas para verificar si ejecuta menos de 32 bits. Si no se ejecutan con la bandera /32BIT+ /Force (La fuerza sólo para conjuntos firmados)

Si ha activado el UAC se puede obtener el siguiente error: corflags : error CF001 : Could not open file for writing Dar al usuario un control total sobre los conjuntos.

Console output

+0

¿Puedes aclarar? ¿Es la captura de pantalla lo que DEBEN ser las banderas de las imágenes? ¿O es la situación de captura de pantalla lo que le causó problemas? Obtengo la COMException del póster y mi ejecutable tiene exactamente las mismas banderas que en la captura de pantalla. –

+0

@ CalvinFisher Esta es la captura de pantalla de cómo debería ser. (En mi caso) –

7

Solución:

La posible solución consiste en modificar la plataforma de su proyecto de 'Cualquier CPU' a 'X 86' (en las propiedades del proyecto, el objetivo build/de la Plataforma)

rootCause

VSS Interop es un ensamblado administrado que usa Framework de 32 bits y el dll contiene un objeto COM de 32 bits. Si ejecuta este dll COM en el entorno de 64 bits, obtendrá el mensaje de error.

-2

Mover sobresalir variables que son declarar mundial en su forma a lo local como en mi forma que tengo:

Dim xls As New MyExcel.Interop.Application 
Dim xlb As MyExcel.Interop.Workbook 

por encima de dos líneas eran declarar mundial en mi forma, así que moví estas dos líneas a la función local y ahora la herramienta está funcionando bien.

Cuestiones relacionadas