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

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

Question

J'ai développé un service Windows en utilisant C # .NET pour générer un rapport PDF. Pour générer un fichier PDF, j'utilise une DLL tierce. L'application est en cours d'exécution sur ma plate-forme Windows XP. Lorsque j'ai déployé le service dans la version 64 bits de Windows Server 2008 , j'ai eu cette erreur:

  

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

J'ai enregistré la DLL à l'aide de la commande regsvr32. J'ai pu voir ce CLSID dans le registre. Mais le problème persiste.

Quel pourrait être le problème?

Était-ce utile?

La solution

Dans VS - Propriétés du projet - Dans l'onglet Construction - Platform target = X86

Autres conseils

On dirait que votre service a été créé sur "Tout processeur", ce qui vous a occasionné des erreurs sur les versions 64 bits sur lesquelles vous utilisez des composants COM. Vous devez le construire pour x86.

Le site Web s'exécute probablement en tant que processus 32 bits, c'est pourquoi il peut utiliser le composant. Si vous construisez votre solution contre <=>, votre service s'exécutera en tant que version 32 bits.

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

J'avais besoin d'utiliser une ancienne DLL 32 bits au sein d'une application Web en cours de développement sur un ordinateur 64 bits. J'ai enregistré la DLL 32 bits dans le dossier Windows \ sysWOW64 à l'aide de la version de regsrv32 de ce dossier.

Les appels à la DLL tierce ont fonctionné à partir de tests unitaires dans Visual Studio mais ont échoué à partir de l'application Web hébergée dans IIS sur le même ordinateur avec l'erreur 80040154.

Modification du pool d'applications en & "Activer les applications 32 bits" & "; résolu le problème.

Il n'est pas nécessaire de configurer la cible de la plate-forme X86 des propriétés de votre projet. Vous pouvez également configurer les options iis pour qu'elles fonctionnent avec x86 comme cela

  • Sélectionner un pool d'applications
  • Sélectionnez le pool utilisé par votre application
  • Paramètres avancés
  • Activer les applications 32 bits true

Si vous cherchez un moyen de faire fonctionner ce travail sans recompiler votre application Any CPU, voici une autre solution de contournement potentielle:

  1. Localisez votre GUID d'objet COM sous le répertoire HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. Une fois localisé, ajoutez une nouvelle valeur REG_SZ (chaîne). Le nom doit être AppID et les données doivent être le même GUID d'objet COM que vous venez de rechercher
  3. Ajoutez une nouvelle clé sous HKey_Classes_Root \ Wow6432Node \ AppID. La nouvelle clé doit avoir le même nom que le GUID de l'objet COM.
  4. Sous la nouvelle clé que vous venez d'ajouter, ajoutez une nouvelle valeur de chaîne et appelez-la DllSurrogate. Laissez la valeur vide.
  5. Créez une nouvelle clé sous HKey_Local_Machine \ Software \ Classes \ AppID \. De nouveau, la nouvelle clé doit être appelée de la même manière que le GUID de l'objet COM & # 8217; Aucune valeur n'est nécessaire pour être ajoutée sous cette clé.

Je ne prends aucun crédit pour la solution, mais cela a fonctionné pour nous. Vérifiez le lien source pour plus d’informations et d’autres commentaires.

Source: https://techtalk.gfi.com/32bit-object- Environnement 64 bits /

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 convertissez en 32 bits, soit vous le laissez inchangé et vous désactivez le composant COM. Le moyen le plus simple de rendre un serveur COM hors processus est de créer une application COM + - Panneau de configuration - & Gt; Outils d'administration - & Gt; ComponentServices.

Je n'ai modifié aucun paramètre de compilation.

Il suffit de définir & "Activer l'application 32 bits = True &"; dans les paramètres avancés d’AppPool.

Cela a fonctionné pour moi

La solution pour le serveur Windows 2008 x64 est la suivante:

  1. ouvrez cmd.exe avec l'autorisation de l'administrateur.
  2. Copiez la dll dans le dossier C: \ Windows \ SysWOW64
  3. exécutez regsvr32 à partir de C: \ Windows \ SysWOW64
  4. Vérifiez que la dll figure dans le registre de Windows.
  5. Si vous avez un fichier .exe x86 qui utilise la dll, le fichier exe doit être compilé en mode x86.
  6. Le fichier exe doit être installé dans le dossier C: \ Program Files (x86)

Cette procédure est valide, c'est ok.

Vous avez rencontré un problème lié à un correctif différent mais similaire:

J'avais un projet de service Windows réglé sur & "Any-CPU &"; en utilisant une DLL 64 bits. Même message d'erreur. J'ai essayé tout un tas de choses, mais rien n'a fonctionné. Enfin, je suis allé dans le projet Propriétés - & Gt; Construisez et remarquez que le projet avait & "Préférez 32 bits &"; vérifié. Décoché cela et pas plus d'erreur.

Je suppose que le service Windows attendait une DLL 32 bits et ne l'a pas trouvée.

J'avais le même problème, mais les autres réponses ne fournissaient qu'une partie de la solution.

La solution est double:

Supprimer le 64 bits du registre.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Cela ne supprimera pas les références à d'autres copies de la dll dans d'autres dossiers.

ou

  • Recherchez la clé appelée HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Cette clé aura le nom de fichier de la DLL comme valeur par défaut.
  • J'ai supprimé le dossier HKEY_CLASSES_ROOT \ CLSID {......}.

Enregistrez-le en tant que 32 bits:

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

L'enregistrer en tant que 32 bits sans supprimer l'enregistrement 64 bits ne résout pas le problème.

Pour passer à x86:

  1. Créez un projet d'installation pour votre solution.
  2. Après l'avoir créé, accédez à l'Explorateur de solutions, cliquez avec le bouton droit sur le projet d'installation.
    • Appuyez sur Configuration Manager.
    • Cliquez sur: " Plate-forme de solution active " liste déroulante et sélectionnez Nouveau (si aucun x86 n’est affiché)
    • Faites votre choix parmi les premiers combos x86, puis appuyez sur OK.
    • reconstruisez le projet d'installation, puis reconstruisez tout le projet.

Si vous exécutez un site Web, vous pouvez également essayer de configurer votre pool d'applications pour désactiver les applications 32 bits (sous les paramètres avancés d'un pool).

Pour ceux qui utilisent VSTO, le problème pour moi était une référence manquante à l'assemblage office. Il apparaît également si vous essayez d’instancier manuellement certains objets VSTO.

Dans mon cas, le problème a été résolu en recherchant l'ID de classe dans le registre de Windows sur la machine du développeur (car le problème a été posé sur un PC client). Cette action sera placée dans le composant COM à l'origine du problème: une bibliothèque x86 référencée dans mon projet .NET qui n'était pas enregistrée en tant qu'OCX / COM pour le programme d'installation ou l'application de mise à jour.

Cordialement

Mon problème était que j'avais la mauvaise version de MS Sync FrameWork (1.0) dans mes références de projet. Après la mise à jour de la version 2.1, l’erreur avait disparu et la vie est redevenue bonne.

J'ai constaté que mon problème était lié à l'enregistrement réel de la DLL.

Première exécution " Regedit.exe " A partir d’une invite CMD (j’ai porté son niveau de sécurité à Administrateur, & "au cas où &";), recherchez dans le registre (en cliquant sur & "Modifier / Rechercher & dans la liste". RegEdit ou en appuyant sur Ctrl + F) pour le CLSID apparaissant dans le message d'erreur que vous avez reçu concernant la fabrique de classe COM. Mon CLSID était 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Lorsque cette clé est trouvée, sélectionnez la sous-clé " InProcServer2 " sous ce nœud Hive et déterminez le nom de fichier de la DLL posant problème dans le cadre Regedit de droite. affichage sous " Par défaut " . Si ce fichier réside dans & Quot; C: \ Windows \ SysWow64 & "(Tel que C: \ Windows \ SysWow64 \ Redemption.dll &") alors il est important que vous utilisiez le " C: \ Windows \ SysWow64 \ RegSvr32.exe " fichier pour enregistrer cette DLL à partir de la ligne de commande et NON PAS la valeur par défaut " C: \ Windows \ System32 \ RegSvr32.exe " fichier. J'ai donc lancé une invite CMD (sous contrôle de niveau administratif (juste au cas où ce niveau serait requis)) et tapé sur la ligne de commande (dans le cas de ma DLL): C: \ Windows \ SysWow64 \ Redemption.dll : appuyez sur la touche Entrée. Fermez la fenêtre de commande (& "Quittez &" Puis Redémarrez votre ordinateur) (utilisez toujours le redémarrage au lieu de Fermer, puis démarrez, car (étrangement), redémarrez, effectuez un arrêt complet. et recharger de tout alors que & "Arrêter &" et Power-Up rechargent un cache stocké de pilotes et d’autres valeurs (qui peuvent être défectueuses). Lorsque vous enregistrez une DLL à l'avenir, pensez à utiliser le fichier SysWow64 & "; RegSvr32.exe &"; pour toute DLL stockée dans le dossier C: \ Windows \ SysWow64 et ce problème c (s’il est dû à un enregistrement incorrect) ne devrait plus se reproduire.

Dans mon cas, je produis un fichier MS Office comme word ou excel, je lance Win+R et exécute dcomcnfg dans la configuration DCOM, en plus de sélectionner un élément de nom associé à OFFICE (tel que le nom contient Excel ou Word ou Office) et Open the properties, select Identity tab and select the interactive user. comme cette réponse ,

Mon message d'erreur s'affiche CLSID {000209FF-0000-0000-C000-000000000046}. Je dois donc essayer de trouver ce CLSID spécifique dans DCOM Config. Il fonctionne déjà, je le sélectionne et je fais de même avec le interactive user, puis cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top