2011-08-25 10 views
35

Spostamento di un progetto di lavoro C# da un computer Windows a 64 bit 7 macchina ad una macchina a 32 bit di XP ha causato il seguente errore:Come riparare l'errore 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 non è nel Registro di sistema in modo che non è correttamente installato, ma questo è lo stesso ID che precedentemente era un problema sulla macchina Windows 7 a 64 bit. La soluzione a questo errore sulla macchina windows 7 a 64 bit è stata trovata here (cambia Platform Target a x86) ma questo non risolve il problema sulla macchina XP a 32 bit. Come trovo la DLL associata a 681EF637-F129-4AE9-94BB-618937E3F6B6 o, ancora meglio, come posso riparare questa eccezione?

+0

Per quanto ne so, non c'è modo per un processo (64 o 32) di caricare una dll a 32 bit (32 o 64 rispettivamente). – Arun

+0

Si noti che il codice di errore è REGDB_E_CLASSNOTREG. Pertanto, ciò può verificarsi quando un controllo COM/ActiveX non è installato sulla macchina o non è installato per il controllo del processo. –

risposta

20

Per trovare la DLL, andare al computer a 64 bit e aprire il registro. Trova la chiave chiamata HKEY_CLASSES_ROOT\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32. Questa chiave avrà il nome file della DLL come valore predefinito.

Se si è risolto il problema sulla macchina a 64 bit mediante la ricompilazione del progetto per x86, sarà necessario cercare nella parte a 32 bit del registro anziché nella posizione normale. Questo è HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32.

Se la DLL è costruita per 32 bit, è possibile utilizzarla direttamente sulla macchina a 32 bit. Se è costruito per 64 bit, dovrai contattare il fornitore e ottenere una versione a 32 bit da loro.

Quando si dispone della DLL, registrarla eseguendo c: \ windows \ system32 \ regsvr32.exe.

11

Ho avuto lo stesso problema in un servizio di Windows. Tutte le chiavi sono nel posto giusto nel registro. La build del servizio è stata eseguita per x86 e ho ancora ottenuto l'eccezione. Ho trovato informazioni su CorFlags.exe

Eseguirlo sul proprio service.exe senza flag per verificare se si esegue a 32 bit. Se non eseguirlo con la bandiera /32BIT+ /Force (vigore solo per gli assiemi firmati)

Se si è trasformato UAC è possibile ottenere il seguente errore: corflags : error CF001 : Could not open file for writing Dare all'utente il pieno controllo sui gruppi.

Console output

+0

Puoi chiarire - è lo screenshot che cosa dovrebbero essere i flag di immagine? O la situazione dello screenshot è ciò che ti ha causato problemi? Sto ottenendo COMException del poster e il mio eseguibile ha le stesse bandiere dello screenshot. –

+0

@CalvinFisher Questo è lo screenshot come dovrebbe essere. (Nel mio caso) –

7

SOLUZIONE:

La soluzione possibile è di modificare la piattaforma del progetto da 'Qualsiasi CPU' a 'X86' (in Proprietà del Progetto, Costruire/bersaglio della piattaforma)

rootCause

L'interoperabilità VSS è un assembly gestito che utilizza Framework a 32 bit e la DLL contiene un oggetto COM a 32 bit. Se si esegue questa DLL COM in ambiente a 64 bit, verrà visualizzato il messaggio di errore.

-2

Spostare eccellere variabili che sono dichiarare globale nel modulo di locali come nella mia forma ho:

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

sopra due linee erano dichiarare globale nella mia forma così ho spostato queste due righe alla funzione locale e ora lo strumento sta funzionando bene.