290 votes

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

J'ai développé un service Windows utilisant C#.NET pour générer un rapport PDF. Pour générer le fichier PDF, j'utilise une dll d'un tiers. L'application fonctionne sur ma plateforme Windows XP. Lorsque j'ai déployé le service dans Windows Server 2008 version 64 bit, j'ai eu cette erreur :

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

J'ai enregistré la DLL en utilisant la commande regsvr32. J'ai pu voir cette CLSID dans le registre. Mais le problème persiste.

Quel pourrait être le problème ?

1 votes

Une application web hébergée sur le même serveur est capable de générer un fichier PDF sans aucune erreur.

0 votes

Les gars, j'ai essayé toutes les solutions possibles mais j'ai toujours cette erreur. J'ai des assemblages et je les ai enregistrés avec succès mais j'obtiens toujours la même erreur. J'ai vraiment besoin d'aide...

391voto

Fabrice MARIANADIN Points 2256

Dans VS - propriétés du projet - dans l'onglet Build - platform target =X86

7 votes

Dans VS2008 j'ai trouvé cette option sous 'Compile->Options avancées de compilation...' (en bas de l'onglet de la fenêtre). (en bas de l'onglet de la fenêtre) et ensuite 'Target CPU' (x86)

1 votes

Comment se comportera-t-il s'il fonctionne avec un navigateur 64 bits ?

12 votes

Ce n'est pas toujours la solution.

61voto

Daniel Ballinger Points 4883

J'ai rencontré un problème très similaire.

J'avais besoin d'utiliser une ancienne DLL 32 bits dans une application Web qui était développée sur une machine 64 bits. J'ai enregistré la DLL 32 bits dans le répertoire Windows \sysWOW64 en utilisant la version de regsrv32 dans ce dossier.

Les appels à la DLL tierce fonctionnent à partir des tests unitaires dans Visual Studio mais échouent à partir de l'application Web hébergée dans IIS sur la même machine avec l'erreur 80040154.

La modification du pool d'applications pour "Activer les applications 32 bits" a résolu le problème.

1 votes

C'est le moyen le plus simple que j'ai trouvé pour résoudre ce problème. Merci !

6 votes

J'aime beaucoup cette réponse. Il n'y a aucun intérêt à compiler tout un site Web pour x86 si vous n'appelez qu'une petite DLL 32 bits à un moment donné.

0 votes

@Daniel Ballinger Mon application fonctionnera-t-elle en tant que processus 32 bits après avoir effectué le changement ?

59voto

Stevo3000 Points 12725

Il semble que votre service ait été construit pour 'Any CPU', ce qui entraîne des erreurs en 64 bits lorsque vous utilisez des composants COM. Vous devez le construire pour x86 .

Le site Web est probablement exécuté en tant que processus 32 bits, ce qui explique pourquoi il peut utiliser le composant. Construire votre solution contre x86 forcera votre service à fonctionner en 32 bits.

0 votes

Je suis également confronté au même problème. Mon application de bureau est installée avec succès sur un système 64bit. Lors de l'installation, j'ai effectué la synchronisation avec succès, mais lorsque je fais la synchronisation à partir de mon logiciel, l'erreur ci-dessus apparaît.

0 votes

J'essaie de m'inscrire .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx) mais je reçois une erreur Le module n'a pas réussi à se charger. Assurez-vous que le binaire est stocké dans le chemin spécifié ou déboguez-le pour vérifier les problèmes avec le binaire ou les fichiers .DLL dépendants.

0 votes

Et s'il est compilé en 32 bits, c'est la version System regsvr32 qui doit être utilisée, et non la version SysWow64.

16voto

Joshua Starner Points 655

Si vous cherchez un moyen de faire fonctionner ce système sans recompiler votre application Any CPU, voici une autre solution possible :

  1. Localisez le GUID de votre objet COM dans le répertoire HKey_Classes_Root. \Wow6432Node\CLSID\ {GUID}
  2. Une fois localisé, ajoutez une nouvelle valeur REG_SZ (chaîne de caractères). Le nom doit être AppID et les données doivent être le même GUID d'objet COM que celui que vous venez de rechercher.
  3. Ajouter une nouvelle clé sous HKey_Classes_Root \Wow6432Node\AppID. La nouvelle clé doit être appelée de la même manière que le GUID de l'objet COM.
  4. Sous la nouvelle clé que vous venez d'ajouter, ajoutez une nouvelle valeur de type String, et appelez-la DllSurrogate. Laissez la valeur vide.
  5. Créer une nouvelle clé sous HKey_Local_Machine \Software\Classes\AppID\ Là encore, la nouvelle clé doit être appelée de la même manière que le GUID de l'objet COM. Aucune valeur ne doit être ajoutée sous cette clé.

Je ne m'attribue aucun mérite pour cette solution, mais elle a fonctionné pour nous. Consultez le lien source pour plus d'informations et d'autres commentaires.

Fuente: https://techtalk.gfi.com/32bit-object-64bit-environment/

1 votes

Excellentes instructions. J'utilisais un outil tiers, ce qui m'empêchait de modifier la plate-forme de construction. Cette solution a permis de contourner ce problème. Merci !

0 votes

J'ai trouvé la clé comme vous l'avez décrit dans l'étape 1, et ensuite j'ai su quel objet COM cause les problèmes, puis j'ai juste lancé regsvr32 dessus. Merci beaucoup !

0 votes

Quand j'ai fait ça, mon serveur web local (IIS) a commencé à avoir un accès refusé. Cela me dit que c'était un pas dans la bonne direction, mais je ne suis pas sûr de savoir à qui donner l'accès à ce stade. stackoverflow.com/questions/14019401/

14voto

sharptooth Points 93379

Le problème est que le processus serveur est en 64 bits et la bibliothèque en 32 bits et qu'il essaie de créer le composant COM dans le même processus (serveur in-proc). Soit vous recompilez le serveur et le rendez 32 bits, soit vous laissez le serveur inchangé et créez le composant COM en dehors du processus. La façon la plus simple de rendre un serveur COM out-of-process est de créer une application COM+ - Panneau de configuration -> Outils administratifs -> ComponentServices.

0 votes

J'ai rencontré une erreur en essayant de créer une application COM+. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.

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