Recuperando a fábrica de classe COM para o componente com CLSID {XXXX} falhou devido ao seguinte erro: 80040154

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

Pergunta

Eu desenvolvi um serviço do Windows usando C # .NET para gerar o relatório PDF. Para gerar arquivos PDF Eu estou usando uma terceira dll festa. O aplicativo é executado em minha plataforma Windows XP. Quando eu implantado o serviço em Windows Server 2008 versão 64 bits, eu tenho esse erro:

Recuperando a fábrica de classe COM para componente com CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} falhou devido ao seguinte erro: 80040154.

I registrou o DLL usando o comando regsvr32. I capaz de ver este CLSID no registro. Mas as persistir problemas.

O que poderia ser o problema?

Foi útil?

Solução

Em VS - propriedades do projeto - na tab Build - alvo plataforma = X86

Outras dicas

Parece que o serviço foi construído contra 'Qualquer CPU', causando-lhe erros em 64 bits, onde você estiver usando componentes COM. Você precisa construí-lo para x86.

O site é provavelmente executado como um processo de 32 bits que é por isso que pode usar o componente. Construindo sua solução contra x86 irá forçar o serviço para ser executado como de 32 bits.

Eu corri em um problema muito semelhante.

eu precisava usar uma DLL de 32 bits de idade dentro de um aplicativo da Web que estava sendo desenvolvido em uma máquina de 64 bits. Registei-me a DLL de 32 bits para as janelas \ syswow64 pasta usando a versão do regsrv32 nessa pasta.

chamadas para o terceiro DLL trabalhou a partir de testes de unidade no Visual Studio, mas falhou na aplicação da Web hospedado no IIS na mesma máquina com o erro 80040154.

A alteração do agrupamento de aplicações para "Ativar aplicativos de 32 bits" resolveu o problema.

Você não tem que configurar seu projeto propriedades alvo plataforma X86. Você também pode configurar as opções para o trabalho do IIS com x86 assim

  • piscina, selecione Aplicação
  • Selecione a piscina que seus usos de aplicativos
  • Configurações avançadas
  • Ativar aplicativos de 32 bits true

Se você está procurando uma maneira de fazer este trabalho sem recompilar seu aplicativo Qualquer CPU, aqui é outra solução potencial:

  1. Localize o seu COM objeto GUID sob o HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \ {GUID}
  2. Uma vez localizado adicionar um novo REG_SZ (string) Valor. Nome deve ser AppID e os dados devem ser o mesmo objeto COM GUID que você acabou procurou
  3. Adicionar uma nova chave em HKEY_CLASSES_ROOT \ Wow6432Node \ AppID. A nova chave deve ser chamado o mesmo que o objeto COM GUID.
  4. Sob a nova chave que você acabou de adicionar, adicionar um novo valor String, e chamá-lo DllSurrogate. Deixe o valor vazio.
  5. Criar uma nova chave sob HKEY_LOCAL_MACHINE \ Software \ Classes \ AppID \ Mais uma vez a nova chave deve ser chamado a mesma GUID do objeto COM. Não há valores são necessários para ser acrescentado a esta chave.

Eu tomo nenhum crédito para a solução, mas funcionou para nós. Verifique o link da fonte para mais informações e outros comentários.

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

O problema é que o processo do servidor é de 64 bits e a biblioteca é de 32 bits e ele tenta criar o componente COM no mesmo processo (servidor in-proc). Ou você recompilar o servidor e torná-lo 32 bits ou deixar o servidor inalterado e tornar o componente COM out-of-process. A maneira mais fácil de fazer um servidor COM fora de processo é criar um aplicativo COM + - Painel de Controle -> Ferramentas Administrativas -.> ComponentServices

Eu não alterar as configurações de compilação.

Basta definir "Ativar aplicação de 32 bits = True" em apppool Configurações avançadas.

Ela trabalhou para mim

A solução para windows 2008 servidor x64 é:

  1. cmd.exe aberto com permissão de Administrador.
  2. Copie a dll para a pasta C: \ Windows \ SysWOW64
  3. Executar regsvr32 a partir C: \ Windows \ SysWOW64
  4. Verifique se dll é no registro do Windows.
  5. Se você tem um x86 .exe que usar a DLL, o exe deve ser compilado no modo x86.
  6. O exe deve ser instalado na pasta C: \ Program Files (x86)

Este procedimento é válido, é ok.

Tive um problema relacionado com um diferente, mas correção semelhante:

Eu tive um Windows conjunto de projeto de serviço para "Qualquer CPU" usando uma DLL de 64 bits. mensagem de erro mesmo. Tentou um monte de coisas, mas nada funcionou. Finalmente, eu fui para projeto de Propriedades -> Construir e notou que o projeto tinha "Prefere 32-bit" marcada. Desligado esta e não mais erro.

Meu palpite é que o serviço de janelas estava esperando uma DLL de 32 bits, e não poderia encontrá-lo.

Eu tive o mesmo problema, mas as outras respostas fornecido apenas uma parte da solução.

A solução é duas vezes:

Remova a 64 bits do Registery.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Isto não irá remover referências a outros copiados da DLL em outras pastas.

ou

  • Encontre a chave chamada HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Esta chave terá o nome do arquivo do DLL como seu valor padrão.
  • I removido a pasta HKEY_CLASSES_ROOT \ CLSID {......}.

registrá-lo como de 32 bits:

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

Registrando-lo como de 32 bits sem remover o registro de 64 bits não resolver o meu problema.

Para mudar para x86:

  1. Criar um projeto de instalação para a sua solução.
  2. Depois de criá-lo, vá para o Solution Explorer, clique direito no projeto de instalação.
    • Pressione Configuration Manager.
    • Clique em: "Ativo Solution Platform" combobox e selecione Novo (Se não houver x86 exibido)
    • Selecionar de primeira x86 de combinação, em seguida, pressione OK.
    • reconstruir projeto de instalação, em seguida, reconstruir Tudo o projeto.

Se você estiver executando um site, você pode também tentar definir o pool de aplicativos para desativar aplicativos de 32 bits (em configurações avançadas de uma piscina).

Para qualquer um usando o VSTO, o problema para mim foi uma referência que faltava para o office montagem. Também parece se você estivesse tentando instanciar certa VSTO objetos manualmente.

No meu caso pessoal do problema foi corrigido procurar a ID classe no Registro do Windows na máquina do desenvolvedor (porque a questão foi jogado em um PC cliente). Esta acção será colocado no componente COM que provoca o problema:. uma biblioteca x86 referenciado no meu projeto .NET que não estava sendo registrado como OCX / COM para o aplicativo instalador ou atualizador

Saudações

Meu problema era que eu tinha errado versão MS Sync Framework (1.0) no meu projeto Referências. Após atualização para a versão 2.1, o erro se foi ea vida é boa novamente.

Eu descobri que meu problema relacionado com o registo real da DLL.

Primeiro run "Regedit.exe" de um CMD prompt de (I elevou o nível de segurança que seja para administrador, "just in case"), em seguida, procurar o Registro (clicando em "Editar / Localizar" no menu RegEdit ou pressionando Ctrl + F) para o CLSID mostrando na mensagem de erro que você recebeu em relação à fábrica de classe COM. Meu CLSID foi 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Quando esta chave é encontrada, selecionar o sub-chave "InProcServer2" sob esse nó Hive e verificar o nome do arquivo do DLL problema no quadro Regedit mão direita. mostrando em "Default". Se que reside arquivo em "C: \ Windows \ SysWow64" (como C: \ Windows \ SysWow64 \ Redemption.dll ") então é importante que você use o "C: \ Windows \ SysWow64 \ RegSvr32.exe" arquivo para registrar que DLL a partir da linha de comando e não o padrão "C: \ Windows \ System32 \ RegSvr32.exe" arquivo. Então eu corri um CMD prompt de (sob controle de nível administrativo (apenas no caso de este nível é necessário exigido) e tipo na linha de comando (no caso da minha DLL): C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll a imprensa entrar. Fechar a janela de comando (através de "Exit", em seguida, Restart o seu computador (sempre uso reiniciar em vez de fechar, em seguida, iniciar-se, uma vez que (estranhamente) Restart executar uma fechada completa para baixo e recarga de tudo enquanto "Down Shut "e Power-Up recarrega um cache armazenado de motoristas e outros valores (que podem estar com defeito). Sempre que você registrar um DLL no futuro, lembre-se de usar o SysWow64 "RegSvr32.exe" para qualquer DLL armazenado na pasta C: \ Windows \ SysWow64 e este problema c (se ela é causada por registro incorreto) não deve acontecer novamente.

No meu caso, eu estou produzindo ms arquivo de escritório como word ou excel, eu corro Win+R e executar dcomcnfg, na configuração DCOM, além selecione o item ESCRITÓRIO nome relacionado (tal como o nome contém Excel ou Word ou Office) e Open the properties, select Identity tab and select the interactive user. como esta resposta ,

A minha mensagem de erro mostram CLSID {000209FF-0000-0000-C000-000000000046}, então eu tenho que tentar encontrar este CLSID específico em DCOM Config, e ele faz exsits, e eu selecioná-lo e seguir mesmo passo definir o interactive user, então ele funciona.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top