Il recupero del factory di classe COM per il componente con CLSID {XXXX} non è riuscito a causa del seguente errore: 80040154

StackOverflow https://stackoverflow.com/questions/1036856

Domanda

Ho sviluppato un servizio Windows utilizzando C # .NET per generare report PDF. Per generare un file PDF sto usando una DLL di terze parti. L'applicazione è in esecuzione sulla mia piattaforma Windows XP. Quando ho distribuito il servizio in Windows Server 2008 versione a 64 bit, ho riscontrato questo errore:

  

Recupero del factory di classe COM per   componente con CLSID   {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}   non riuscito a causa del seguente errore:   80040154.

Ho registrato la DLL usando il comando regsvr32. Ho potuto vedere questo CLSID nel registro. Ma il problema persiste.

Quale potrebbe essere il problema?

È stato utile?

Soluzione

In VS - proprietà del progetto - nella scheda Build - platform target = X86

Altri suggerimenti

Sembra che il tuo servizio sia stato creato contro "Any CPU", causando errori su 64 bit in cui stai utilizzando componenti COM. Devi crearlo per x86.

Il sito Web probabilmente è in esecuzione come processo a 32 bit, motivo per cui può utilizzare il componente. Costruire la tua soluzione contro <=> costringerà il tuo servizio a 32 bit.

Ho riscontrato un problema molto simile.

Avevo bisogno di usare una vecchia DLL a 32 bit all'interno di un'applicazione Web che era stata sviluppata su un computer a 64 bit. Ho registrato la DLL a 32 bit nella cartella windows \ sysWOW64 utilizzando la versione di regsrv32 in quella cartella.

Le chiamate alla DLL di terze parti hanno funzionato dai test unitari in Visual Studio ma non sono riuscite dall'applicazione Web ospitata in IIS sullo stesso computer con l'errore 80040154.

Modifica del pool di applicazioni in " Abilita applicazioni a 32 bit " risolto il problema.

Non è necessario configurare la destinazione della piattaforma delle proprietà del progetto X86. Puoi anche configurare le opzioni di IIS per funzionare con x86 in questo modo

  • Seleziona pool di applicazioni
  • Seleziona il pool utilizzato dalla tua app
  • Impostazioni avanzate
  • Abilita le applicazioni a 32 bit tr<

Se stai cercando un modo per farlo funzionare senza ricompilare la tua applicazione Any CPU, ecco un'altra soluzione alternativa:

  1. Individua il GUID dell'oggetto COM in HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Una volta individuato, aggiungere un nuovo valore REG_SZ (stringa). Il nome deve essere AppID e i dati devono essere lo stesso GUID dell'oggetto COM che hai appena cercato
  3. Aggiungi una nuova chiave in HKey_Classes_Root \ Wow6432Node \ AppID. La nuova chiave deve essere chiamata uguale al GUID dell'oggetto COM.
  4. Sotto la nuova chiave appena aggiunta, aggiungi un nuovo valore stringa e chiamalo DllSurrogate. Lascia il valore vuoto.
  5. Crea una nuova chiave in HKey_Local_Machine \ Software \ Classes \ AppID \ Ancora una volta la nuova chiave dovrebbe essere chiamata uguale all'oggetto COM & # 8217; s GUID. Non è necessario aggiungere valori in questa chiave.

Non mi merito per la soluzione, ma ha funzionato per noi. Controlla il link di origine per ulteriori informazioni e altri commenti.

Fonte: https://techtalk.gfi.com/32bit-object- 64bit-ambiente /

Il problema è che il processo del server è a 64 bit e la libreria a 32 bit e tenta di creare il componente COM nello stesso processo (server in-proc). O ricompilare il server e renderlo a 32 bit oppure lasciare invariato il server e rendere fuori processo il componente COM. Il modo più semplice per rendere out-of-process un server COM è creare un'applicazione COM + - Pannello di controllo - & Gt; Strumenti di amministrazione - & Gt; ComponentServices.

Non ho modificato alcuna impostazione di compilazione.

Basta impostare " Abilita applicazione a 32 bit = True " nelle impostazioni avanzate di AppPool.

Ha funzionato per me

La soluzione per Windows 2008 Server x64 è:

  1. apri cmd.exe con l'autorizzazione dell'amministratore.
  2. Copia la dll nella cartella C: \ Windows \ SysWOW64
  3. esegui regsvr32 da C: \ Windows \ SysWOW64
  4. Verifica che la dll sia nel registro di Windows.
  5. Se hai un .exe x86 che usa la dll, l'exe deve essere compilato in modalità x86.
  6. L'exe deve essere installato nella cartella C: \ Programmi (x86)

Questa procedura è valida, è ok.

Si è verificato un problema correlato con una correzione diversa, ma simile:

Avevo un progetto di servizio di Windows impostato su " Any-CPU " utilizzando una DLL a 64 bit. Stesso messaggio di errore. Ho provato un sacco di cose, ma niente ha funzionato. Infine, sono entrato nel progetto Proprietà - & Gt; Costruito e notato che il progetto aveva & Quot; Preferisce 32! Bit & Quot; controllato. Deselezionato questo e non più errori.

La mia ipotesi è che il servizio Windows si aspettasse una DLL a 32 bit e non è riuscito a trovarlo.

Ho avuto lo stesso problema, ma le altre risposte hanno fornito solo una parte della soluzione.

La soluzione è duplice:

Rimuovi 64 bit dal registro.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Questo non rimuoverà i riferimenti ad altri copiati della DLL in altre cartelle.

o

  • Trova la chiave denominata HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Questa chiave avrà il nome file della DLL come valore predefinito.
  • Ho rimosso la cartella HKEY_CLASSES_ROOT \ CLSID {......}.

Registralo come 32 bit:

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

La registrazione come 32 bit senza rimuovere la registrazione a 64 bit non risolve il mio problema.

Per passare a x86:

  1. Crea un progetto di installazione per la tua soluzione.
  2. Dopo averlo creato, vai a Esplora soluzioni, fai clic con il pulsante destro del mouse sul progetto di installazione.
    • Premi Configuration Manager.
    • Fare clic su: " Piattaforma soluzione attiva " casella combinata e selezionare Nuovo (se non viene visualizzato x86)
    • Seleziona dalla prima combinazione x86, quindi premi OK.
    • ricostruisci il progetto di installazione, quindi ricostruisci tutto il progetto.

Se stai gestendo un sito Web, puoi anche provare a impostare il pool di applicazioni in modo da disabilitare le applicazioni a 32 bit (nelle impostazioni avanzate di un pool).

Per chiunque utilizzi VSTO, il problema per me era un riferimento mancante all'assemblea office. Sembrerebbe anche se si stesse provando a creare un'istanza di determinati oggetti VSTO manualmente.

Nel mio caso personale il problema è stato risolto cercando l'id della classe nel registro di Windows sul computer dello sviluppatore (perché il problema era stato generato in un PC client). Questa azione verrà inserita nel componente COM che causa il problema: una libreria x86 referenziata nel mio progetto .NET che non era registrata come OCX / COM per l'applicazione di installazione o aggiornamento.

Saluti

Il mio problema era che avevo una versione MS Sync FrameWork (1.0) sbagliata nei riferimenti del mio progetto. Dopo l'aggiornamento alla versione 2.1, l'errore era sparito e la vita è di nuovo buona.

Ho scoperto che il mio problema riguardava l'effettiva registrazione della DLL.

Prima esecuzione " Regedit.exe " da un prompt CMD (ho alzato il livello di sicurezza ad Amministratore, " nel caso ") quindi cerca nel registro (facendo clic su " Modifica / Trova " nella Menu RegEdit o premendo Ctrl + F) per il CLSID visualizzato nel messaggio di errore ricevuto relativo al factory di classe COM. Il mio CLSID era 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Quando viene trovata questa chiave, selezionare la sottochiave " InProcServer2 " sotto quel nodo Hive e accertare il nome file della DLL problematica nel riquadro Regedit a destra. visualizzato sotto " Predefinito " . Se quel file risiede tra & Quot; C: \ Windows \ SysWow64 & Quot; (come C: \ Windows \ SysWow64 \ Redemption.dll & Quot;) quindi è importante utilizzare la quot &; C: \ Windows \ SysWow64 \ RegSvr32.exe " file per registrare quella DLL dalla riga di comando e NON il " predefinito; C: \ Windows \ System32 \ RegSvr32.exe " file. Quindi ho eseguito un prompt CMD (sotto Controllo livello amministrativo (nel caso sia necessario questo livello) e digito sulla riga di comando (nel caso della mia DLL): C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll premere Invio. Chiudi la finestra di comando (tramite & Quot; Esci da & Quot; quindi Riavvia il tuo computer (usa sempre riavvia invece di Chiudi giù quindi avvia, poiché (stranamente) Riavvia esegue un arresto completo e ricaricare tutto mentre " Shut Down " e Power-Up ricarica una cache memorizzata di driver e altri valori (che potrebbero essere difettosi). Ogni volta che si registra una DLL in futuro, ricordarsi di utilizzare la quot SysWow64 &; RegSvr32.exe &; per qualsiasi DLL memorizzata nella cartella C: \ Windows \ SysWow64 e questo problema c (se è causato da una registrazione errata) non dovrebbe ripetersi.

Nel mio caso, sto producendo file ms office come word o excel, eseguo Win+R ed eseguo dcomcnfg, nella configurazione DCOM, oltre a selezionare l'elemento del nome correlato a OFFICE (come il nome contiene Excel o Word o Office) e Open the properties, select Identity tab and select the interactive user. come questa risposta ,

Il mio messaggio di errore mostra CLSID {000209FF-0000-0000-C000-000000000046}, quindi devo provare a trovare questo CLSID specifico in DCOM Config, ed esce, lo seleziono e seguo lo stesso passo impostato interactive user, quindi funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top