Het ophalen van de COM-klassefabriek voor component met CLSID {XXXX} is mislukt vanwege de volgende fout: 80040154

Ik heb een Windows-service ontwikkeld met C#.NET om een ​​PDF-rapport te genereren. Om een ​​PDF-bestand te genereren, gebruik ik een dll van een derde partij. De applicatie draait op mijn Windows XP-platform. Toen ik de service implementeerde in Windows Server 200864-bits versie, kreeg ik deze foutmelding:

De COM-klassefabriek ophalen voor
component met CLSID
{46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}
mislukt vanwege de volgende fout:
80040154.

Ik heb de DLL geregistreerd met de opdracht regsvr32. Ik kan deze CLSID in het register zien. Maar het probleem blijft bestaan.

Wat zou het probleem kunnen zijn?


Antwoord 1, autoriteit 100%

In VS – projecteigenschappen – op het tabblad Bouwen – platformdoel =X86


Antwoord 2, autoriteit 16%

Ik kwam een ​​vergelijkbaar probleem tegen.

Ik moest een oude 32-bits DLL gebruiken in een webtoepassing die werd ontwikkeld op een 64-bits machine. Ik heb de 32-bits DLL geregistreerd in de map windows\sysWOW64 met de versie van regsrv32 in die map.

Oproepen naar de DLL van derden werkten vanuit eenheidstests in Visual Studio, maar mislukten vanuit de webtoepassing die werd gehost in IIS op dezelfde computer met de 80040154-fout.

Het probleem is opgelost door de toepassingsgroep te wijzigen in ’32-bits toepassingen inschakelen’.


Antwoord 3, autoriteit 15%

Het klinkt alsof je service is gebouwd tegen ‘Elke CPU’, waardoor je fouten krijgt op 64-bits waar je COM-componenten gebruikt. Je moet het bouwen voor x86.

De website wordt waarschijnlijk uitgevoerd als een 32-bits proces en daarom kan het de component gebruiken. Als u uw oplossing bouwt tegen x86, wordt uw service gedwongen als 32-bits te werken.


Antwoord 4, autoriteit 5%

U hoeft uw platformdoel X86 voor projecteigenschappen niet te configureren.
Je kunt ook de iis-opties configureren om zo met x86 te werken

  • Applicatiepool selecteren
  • Selecteer de pool die uw app gebruikt
  • Geavanceerde instellingen
  • Schakel 32-bits toepassingen in true

Antwoord 5, autoriteit 4%

Als u op zoek bent naar een manier om dit te laten werken zonder uw Any CPU-toepassing opnieuw te compileren, is hier nog een mogelijke oplossing:

  1. Zoek uw COM-object-GUID onder de HKey_Classes_Root\Wow6432Node\CLSID\{GUID}
  2. Eenmaal gevonden, voeg een nieuwe REG_SZ (string) waarde toe. De naam moet AppID zijn en de gegevens moeten hetzelfde COM-object-GUID zijn waarnaar u zojuist hebt gezocht
  3. Voeg een nieuwe sleutel toe onder HKey_Classes_Root\Wow6432Node\AppID. De nieuwe sleutel moet dezelfde naam hebben als de GUID van het COM-object.
  4. Voeg onder de nieuwe sleutel die u zojuist hebt toegevoegd een nieuwe tekenreekswaarde toe en noem deze DllSurrogate. Laat de waarde leeg.
  5. Maak een nieuwe sleutel onder HKey_Local_Machine\Software\Classes\AppID\
    Nogmaals, de nieuwe sleutel moet hetzelfde worden genoemd als de GUID van het COM-object. Er hoeven geen waarden onder deze sleutel te worden toegevoegd.

Ik neem geen eer voor de oplossing, maar het werkte voor ons. Bekijk de bronlink voor meer informatie en andere opmerkingen.

Bron: https://techtalk.gfi.com/32bit-object-64bit -omgeving/


Antwoord 6, autoriteit 4%

Het probleem is dat het serverproces 64-bits is en de bibliotheek 32-bits en probeert de COM-component in hetzelfde proces te maken (in-proc server). Ofwel hercompileert u de server en maakt u deze 32-bits of u laat de server ongewijzigd en maakt de COM-component out-of-process. De eenvoudigste manier om een ​​COM-server out-of-process te maken, is door een COM+-toepassing te maken – Configuratiescherm -> Administratieve hulpmiddelen -> ComponentServices.


Antwoord 7, autoriteit 2%

Ik heb geen compilatie-instellingen gewijzigd.

Stel gewoon “Enable 32-bit Application = True” in in de geavanceerde instellingen van AppPool.

Het werkte voor mij


Antwoord 8, autoriteit 2%

Ik had hetzelfde probleem, maar de andere antwoorden leverden slechts een deel van de oplossing op.

De oplossing is tweeledig:

Verwijder de 64bit uit het register.

  • c:\windows\system32\regsvr32.exe /U <file.dll>
  • Hiermee worden geen verwijzingen naar andere kopieën van de dll in andere mappen verwijderd.

of

  • Zoek de sleutel met de naam HKEY_CLASSES_ROOT\CLSID{……}\InprocServer32. Deze sleutel heeft de bestandsnaam van de DLL als standaardwaarde.
  • Ik heb de map HKEY_CLASSES_ROOT\CLSID{……} verwijderd.

Registreer het als 32bit:

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

Het registreren als 32-bits zonder de 64-bits registratie te verwijderen, lost mijn probleem niet op.


Antwoord 9, autoriteit 2%

De oplossing voor Windows 2008 Server x64 is:

  1. open cmd.exe met beheerdersrechten.
  2. Kopieer de dll naar de map C:\Windows\SysWOW64
  3. voer regsvr32 uit vanuit C:\Windows\SysWOW64
  4. Controleer of de dll in het register van Windows staat.
  5. Als je een .exe x86 hebt die de dll gebruikt, moet de exe in x86-modus worden gecompileerd.
  6. De exe moet geïnstalleerd zijn in map C:\Program Files (x86)

Deze procedure is geldig, het is oké.


Antwoord 10

Had een gerelateerd probleem met een andere, maar vergelijkbare oplossing:

Ik had een Windows-serviceproject ingesteld op ‘Any-CPU’ met een 64-bits DLL. Zelfde foutmelding. Allerlei dingen geprobeerd, maar niets werkte. Ten slotte ging ik naar het project Eigenschappen -> Build en merkte dat het project “Prefer 32-bit” had aangevinkt. Dit aangevinkt en geen foutmelding meer.

Mijn gok is dat de Windows-service een 32-bits DLL verwachtte en deze niet kon vinden.


Antwoord 11

Overschakelen naar x86:

  1. Maak een installatieproject voor uw oplossing.
  2. Nadat u het hebt gemaakt, gaat u naar Solution Explorer en klikt u met de rechtermuisknop op het installatieproject.
    • Druk op Configuratiebeheer.
    • Klik op: “Active Solution Platform” combobox en selecteer Nieuw (Als er geen x86 wordt weergegeven)
    • Selecteer uit eerste combo x86 en druk op OK.
    • maak Setup-project opnieuw en herbouw vervolgens het hele project.

Antwoord 12

Als u een website heeft, kunt u ook proberen uw applicatiepool zo in te stellen dat 32-bits applicaties worden uitgeschakeld (onder geavanceerde instellingen van een pool).


Antwoord 13

In mijn persoonlijke geval was het probleem opgelost bij het zoeken naar de klasse-ID in het Windows-register op de ontwikkelaarsmachine (omdat het probleem op een client-pc werd gegooid). Deze actie wordt in de COM-component geplaatst die het probleem veroorzaakt: een x86-bibliotheek waarnaar wordt verwezen in mijn .NET-project die niet was geregistreerd als OCX/COMvoor het installatieprogramma of de updater-toepassing.

Met vriendelijke groeten


Antwoord 14

Ik ontdekte dat mijn probleem te maken had met de daadwerkelijke registratie van de DLL.

  • Voer eerst “Regedit.exe” uit vanaf een CMD-prompt (ik heb het beveiligingsniveau verhoogd naar Beheerder, “voor het geval dat”)
  • zoek vervolgens in het register (door te klikken op “Bewerken/Zoeken” in het RegEdit-menu of door op Ctrl+F te drukken) naar de CLSID die wordt weergegeven in het foutbericht dat u hebt ontvangen met betrekking tot de COM-klassefabriek. Mijn CLSID was 29AB7A12-B531-450E-8F7A-EA94C2F3C05F.
  • Wanneer deze sleutel is gevonden, selecteert u de subsleutel “InProcServer2” onder dat Hive-knooppunt en controleert u de bestandsnaam van de probleem-DLL in het rechter Regedit-frame. weergegeven onder “Standaard”.
  • Als dat bestand zich in “C:\Windows\SysWow64″ bevindt (zoals C:\Windows\SysWow64\Redemption.dll”), is het belangrijk dat u de “C:\Windows\SysWow64\RegSvr32.exe” gebruikt ” bestand om die DLL vanaf de opdrachtregel te registreren en NIET het standaard “C:\Windows\System32\RegSvr32.exe” bestand.
  • Dus ik heb een CMD-prompt uitgevoerd (onder beheer op administratief niveau (voor het geval dit niveau nodig is) en typ op de opdrachtregel (in het geval van mijn DLL):
    C:\Windows\SysWow64\RegSvr32.exe c:\Windows\SysWow64\Redemption.dlldruk op enter.
  • Sluit het opdrachtvenster (via “Afsluiten” en Herstartuw computer vervolgens (gebruik altijd opnieuw opstarten in plaats van Sluiten en start dan op, aangezien (vreemd genoeg) Opnieuw opstarten voer een grondige afsluiting uit en laad alles opnieuw terwijl “Shut Down” en Power-Up laadt een opgeslagen cache met stuurprogramma’s en andere waarden (die mogelijk defect zijn) opnieuw.
  • Als u in de toekomst een DLL registreert, vergeet dan niet om SysWow64 “RegSvr32.exe” te gebruiken voor elke DLL die is opgeslagen in de map C:\Windows\SysWow64 en dit probleem (als het wordt veroorzaakt door onjuiste registratie) zou niet moeten weer gebeuren.

Antwoord 15

Voor iedereen die VSTO gebruikt, was het probleem voor mij een ontbrekende verwijzing naar de Office-assembly. Het zou ook verschijnen als u bepaalde VSTO-objecten handmatig probeert te instantiëren.


Antwoord 16

Mijn probleem was dat ik de verkeerde MS Sync FrameWork-versie (1.0) in mijn project References had. Na update naar versie 2.1 was de fout verdwenen en is het leven weer goed.


Antwoord 17

In mijn geval produceer ik een ms office-bestand zoals wordof Excel, ik voer Win+Ruit en voer dcomcnfg, in de DCOM-configuratie, naast KANTOOR-gerelateerd naamitem selecteren (zoals naam bevat Excelof Wordof Office) en Open the properties, select Identity tab and select the interactive user.als dit antwoord,

Mijn foutmelding toont CLSID {000209FF-0000-0000-C000-000000000046}, dus ik moet proberen deze specifieke CLSID te vinden in DCOM Config, en het bestaat en ik selecteer het en volg dezelfde stap om de interactive userin te stellen, dan werkt het.

Other episodes