290 votes

La récupération de la fabrique de classe COM pour le composant avec CLSID {XXXX} a échoué en raison de l'erreur suivante: 80040154

J'ai développé un service Windows à l'aide de C#.NET pour générer un fichier PDF rapport. Pour générer le fichier PDF que je suis à l'aide d'un tiers dll. L'application est en cours d'exécution dans ma plate-forme Windows XP. Quand j'ai déployé le service dans Windows Server 2008 version 64 bits, j'ai eu cette erreur:

La récupération de la fabrique de classe COM pour le composant avec le CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} a échoué en raison de l'erreur suivante: 80040154.

Je me suis inscrit à la DLL à l'aide de la commande regsvr32. - Je capable de voir ce CLSID dans le registre. Mais le problème persiste.

Quel pourrait être le problème?

391voto

Fabrice MARIANADIN Points 2256

En VS - projet propriétés - dans l’onglet Build - plateforme cible = X86

61voto

Daniel Ballinger Points 4883

J'ai couru dans un problème similaire.

J'avais besoin d'utiliser une ancienne DLL 32 bits à l'intérieur d'une Application Web qui a été développé sur une machine 64 bits. Je me suis inscrit le 32-bit DLL dans le dossier windows\sysWOW64 à l'aide de la version de regsrv32 dans ce dossier.

Les appels à la troisième partie de la DLL a travaillé à partir de tests unitaires dans Visual Studio, mais a échoué à partir de l'Application Web hébergée dans IIS sur la même machine avec le 80040154 erreur.

La modification de l'application de la piscine à "Activer les Applications 32 Bits" a résolu le problème.

59voto

Stevo3000 Points 12725

On dirait que votre service a été construite contre « Any CPU » vous Erreurs causant sur 64 bits lorsque vous utilisez des composants COM. Vous devez le générer pour « x86'.

Le site est proberbly exécute comme un processus 32 bits, c’est pourquoi il peut utiliser le composant. Créez votre solution contre x86 forcera votre service s’exécute sous 32 bits.

16voto

Joshua Starner Points 655

Si vous êtes à la recherche d'un moyen de faire ce travail sans avoir à recompiler votre CPU application, voici une autre solution:

  1. Recherchez votre COM GUID de l'objet sous la HKey_Classes_Root\Wow6432Node\CLSID\{GUID}
  2. Une fois situé ajouter une nouvelle Valeur REG_SZ (chaîne). Le nom doit être AppID et les données doivent être de la même COM GUID de l'objet que vous venez de recherché
  3. Ajoutez une nouvelle clé sous HKey_Classes_Root\Wow6432Node\AppID. La nouvelle clé doit être appelée la même que la COM GUID de l'objet.
  4. En vertu de la nouvelle clé que vous venez d'ajouter, ajouter une nouvelle Valeur de Chaîne, et de l'appeler DllSurrogate. Laissez la valeur vide.
  5. Créer une nouvelle Clé dans HKey_Local_Machine\Software\Classes\AppID\ Nouveau la nouvelle clé doit être appelée le même que l'objet COM GUID. Pas de valeurs sont nécessaires pour être ajouté sous cette clé.

Je ne vais pas prendre le crédit pour la solution, mais il a travaillé pour nous. Vérifiez la source du lien pour plus d'informations et d'autres commentaires.

Source: http://www.gfi.com/blog/32bit-object-64bit-environment/

14voto

sharptooth Points 93379

Le problème est que le processus serveur est 64 bits et la bibliothèque est 32-bit et il tente de créer le composant COM dans le même processus (serveur in-process). Soit vous recompilez le serveur et le rendre 32-bit ou vous laissez le serveur inchangé et rendre le composant COM en mode out-of-process. La meilleure façon de faire un serveur COM en mode out-of-process est de créer une application COM + - panneau de commande->-> ComponentServices outils d’administration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X