关于.net:由于以下错误,检索CLSID为{XXXX}的组件的COM类工厂失败:80040154

Retrieving the COM class factory for component with CLSID {XXXX} failed due to the following error: 80040154

我使用C.NET开发了一个Windows服务来生成PDF报告。要生成PDF文件,我正在使用第三方DLL。应用程序正在我的Windows XP平台上运行。在Windows Server 2008 64位版本中部署该服务时,出现以下错误:

Retrieving the COM class factory for
component with CLSID
{46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}
failed due to the following error:
80040154.

我使用regsvr32命令注册了dll。我可以在注册表中看到这个clsid。但问题依然存在。

有什么问题?


在vs-项目属性-在构建选项卡-平台目标=x86中


听起来您的服务是针对"任何CPU"构建的,导致您在使用COM组件的64位上出错。您需要为x86构建它。

该网站可能以32位进程的形式运行,这就是它可以使用该组件的原因。针对x86构建解决方案将迫使您的服务以32位运行。


我遇到了一个非常相似的问题。

我需要在64位计算机上开发的Web应用程序中使用旧的32位DLL。我使用该文件夹中的regsrv32版本将32位dll注册到windowssysww64文件夹中。

对第三方dll的调用通过Visual Studio中的单元测试工作,但在同一台计算机上的IIS中承载的Web应用程序失败,错误为80040154。

将应用程序池更改为"启用32位应用程序"解决了此问题。


您不必配置项目属性平台目标x86。您还可以将IIS选项配置为使用类似x86的选项。

  • 选择应用程序池
  • 选择应用程序使用的池
  • 高级设置
  • 启用32位应用程序真


如果您正在寻找一种在不重新编译任何CPU应用程序的情况下工作的方法,下面是另一种潜在的解决方法:

  • 在hkey_classes_rootwow6432nodeclsid_guid_下找到COM对象guid。
  • 找到后,添加一个新的Reg_sz(字符串)值。名称应为appid,数据应为刚搜索到的COM对象guid。
  • 在hkey_classes_rootwow6432nodeappid下添加新密钥。新键应与COM对象GUID调用相同。
  • 在刚才添加的新键下,添加一个新的字符串值,并将其称为dllsurrogate。将值保留为空。
  • 在hkey_local_machinesoftwareclassesappid下创建新密钥同样,新的键应该与COM对象的guid相同。无需在此键下添加任何值。
  • 我不相信这个解决方案,但它对我们有用。有关详细信息和其他注释,请查看源链接。

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


    问题是服务器进程是64位的,库是32位的,它试图在同一进程(进程内服务器)中创建COM组件。要么重新编译服务器并将其设为32位,要么保持服务器不变并使COM组件退出进程。使COM服务器脱离进程的最简单方法是创建一个COM+应用程序-控制面板->管理工具->组件服务。


    我没有更改任何编译设置。

    只需在AppPool高级设置中设置"启用32位应用程序=真"。

    它对我有用


    Windows 2008 Server x64的解决方案是:

  • 打开具有管理员权限的cmd.exe。
  • 将DLL复制到文件夹C:WindowsSysWow64
  • 从C:windowssyswow64运行regsvr32
  • 验证dll是否在Windows注册表中。
  • 如果.exe x86使用dll,则必须在x86模式下编译该exe。
  • exe必须安装在C:Program Files(x86)文件夹中。
  • 这个程序有效,没问题。


    我有同样的问题,但其他答案只提供了解决方案的一部分。

    解决方案有两个方面:

    从寄存器中取出64位。

    • C:windowssystem32
      egsvr32.exe/U
    • 这不会删除对其他文件夹中DLL的其他副本的引用。

    • 在procserver32中查找名为hkey_classes_rootclsid……的密钥。此项的默认值是dll的文件名。
    • 我删除了hkey_classes_rootclsid……文件夹。

    注册为32位:

    • C:\Windows\SysWOW64
      egsvr32

    将其注册为32位而不删除64位注册并不能解决我的问题。


    有一个不同但相似的解决方法的相关问题:

    我使用64位的DLL将Windows服务项目设置为"任意CPU"。相同的错误消息。试了很多东西,但都没用。最后,我进入了项目属性->构建,注意到项目已经检查了"首选32位"。取消选中此项,不再出现错误。

    我猜Windows服务需要一个32位的DLL,但找不到它。


    如果您正在运行一个网站,您还可以尝试将应用程序池设置为禁用32位应用程序(在池的高级设置下)。


    要更改为x86:

  • 为解决方案创建安装项目。
  • 创建后,转到解决方案资源管理器,右键单击安装项目。
    • 按配置管理器。
    • 单击"活动解决方案平台"组合框并选择"新建"(如果没有显示x86)
    • 从第一个组合x86中选择,然后按"确定"。
    • 重新生成安装程序项目,然后重新生成所有项目。

  • 对于任何使用vsto的人来说,我的问题是缺少对office组件的引用。如果您试图手动实例化某些vsto对象,它也会出现。


    在我个人的例子中,这个问题被修复了,在开发人员机器上的Windows注册表中搜索类ID(因为这个问题是在客户机上抛出的)。此操作将被放置到导致此问题的COM组件中:我的.NET项目中引用的x86库未注册为安装程序或更新程序应用程序的ocx/com。

    当做


    在我的例子中,我正在生成像wordexcel这样的MS Office文件,我运行Win+R并在DCOM配置中执行dcomcnfg,除了选择与Office相关的名称项(如名称包含excelwordofficeOpen the properties, select Identity tab and select the interactive user.作为此答案外,

    我的错误消息显示CLSID {000209FF-0000-0000-C000-000000000046},所以我必须尝试在dcom配置中找到这个特定的clsid,它确实存在,我选择它并按照相同的步骤设置interactive user,然后它就工作了。


    我的问题是在我的项目引用中使用了错误的MS Sync框架版本(1.0)。在更新到2.1版之后,错误就消失了,生活又恢复了。


    我发现我的问题与DLL的实际注册有关。

    首先从命令提示符运行"regedit.exe"(我将它的安全级别提升为管理员,"以防万一"),然后搜索注册表(通过单击regedit菜单中的"edit/find"或按ctrl+f)对于您收到的有关COM类工厂的错误消息中显示的clsid。我的clsid是29ab7a12-b531-450e-8f7a-ea94c2f3c05f。当找到这把钥匙时,选择该配置单元节点下的子键"inprocserver2",并确定右侧regedit框架中问题dll的文件名。显示在"默认"下。如果该文件位于"C:WindowsSysWow64"中(例如C:WindowsSysWow64
    edemption.dll)然后使用"c:windowssysw64
    egsvr32.exe"文件从命令行注册该dll,而不是默认的"c:windowssystem32
    egsvr32.exe"文件,这一点很重要。因此,我运行了一个命令提示符(在管理级别控制下(仅在需要此级别时)并在命令行上键入(在我的dll中):C:WindowsSysWow64
    egsvr32.exe C:WindowsSysWow64
    edemption.dll按Enter键。关闭命令窗口(通过"退出",然后重新启动计算机(总是使用"重新启动"而不是"关闭",然后启动),因为(奇怪的是)重新启动会彻底关闭并重新加载所有内容,而"关闭"和"通电"会重新加载存储的驱动程序缓存和其他值(可能有故障)。以后注册dll时,请记住对存储在c:windowssysww64文件夹中的任何dll使用sysww64"regsvr32.exe",并且此问题c(如果是由错误注册引起的)不应再次发生。