检索具有CLSID {XXXX}的组件的COM类工厂失败,原因如下:80040154

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

检索具有CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}的组件的COM类工厂失败,原因如下:80040154。

我使用regsvr32命令注册DLL。 我能够在registry中看到这个CLSID。 但问题依然存在。

可能是什么问题呢?

在VS – 项目属性 – 在生成选项卡 ​​- 平台目标= X86

这听起来像您的服务是针对“任何CPU”构build的,导致您在使用COM组件时的64位错误。 您需要为x86构build它。

该网站可能是作为一个32位进程运行,这就是为什么它可以使用该组件。 针对x86构build解决scheme将强制您的服务以32位运行。

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

我需要在64位机器上开发的Web应用程序中使用旧的32位DLL。 我使用该文件夹中的regsrv32版本将32位DLL注册到了windows \ sysWOW64文件夹中。

调用第三方DLL从Visual Studio中的unit testing工作,但在80040154错误的同一台机器上的IIS中托pipe的Web应用程序失败。

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

问题是服务器进程是64位,库是32位,它试图在同一进程(in-proc服务器)中创buildCOM组件。 或者重新编译服务器并将其设置为32位,或者保持服务器不变,并使COM组件处于进程外。 使COM服务器进程外的最简单方法是创build一个COM +应用程序 – 控制面板 – >pipe理工具 – > ComponentServices。

如果您正在寻找一种方法来使这个工作无需重新编译任何CPU应用程序,这是另一个潜在的解决方法:

  1. find您的COM对象GUID下的HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. 一旦find添加一个新的REG_SZ(string)值。 名称应该是AppID,并且数据应该是您刚刚search的同一个COM对象GUID
  3. 在HKey_Classes_Root \ Wow6432Node \ AppID下添加一个新的密钥。 新的键应该被称为COM对象的GUID相同。
  4. 在刚刚添加的新密钥下,添加一个新的string值,并将其称为DllSurrogate。 保留空值。
  5. 在HKey_Local_Machine \ Software \ Classes \ AppID下创build一个新的密钥。再次,新的密钥应该和COM对象的GUID一样被调用。 这个键下不需要添加任何值。

我对这个解决scheme没有信任,但是它对我们有效。 检查来源链接了解更多信息和其他评论。

资料来源: http : //www.gfi.com/blog/32bit-object-64bit-environment/

您不必configuration您的项目属性平台目标X86。 你也可以像这样configurationiis选项来使用x86

  • select应用程序池
  • select您的应用使用的游泳池
  • 高级设置
  • 启用32位应用程序为true

Windows 2008 Server x64的解决scheme是:

  1. 使用pipe理员权限打开cmd.exe。
  2. 将该dll复制到文件夹C:\ Windows \ SysWOW64
  3. 从C:\ Windows \ SysWOW64运行regsvr32
  4. validation该DLL是在Windowsregistry中。
  5. 如果你有一个使用dll的.exe x86,则exe文件必须以x86模式编译。
  6. 该exe文件必须安装在文件夹C:\ Program Files(x86)

这个程序是有效的,没关系。

有一个不同的,但类似的修复相关的问题:

我有一个使用64位DLL设置为“Any-CPU”的Windows服务项目。 相同的错误讯息。 试了一大堆东西,但没有任何工作。 最后,我进入项目“属性” – >“生成”,并注意到该项目已选中“首选32位”。 取消选中这个,没有更多的错误。

我的猜测是,Windows服务期待一个32位的DLL,并找不到它。

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

只需在AppPool高级设置中设置“启用32位应用程序=真”即可。

它为我工作

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

解决scheme有两个方面:

从registry中删除64位。

  • c:\ windows \ system32 \ regsvr32.exe / U
  • 这不会删除对其他文件夹中其他复制的dll的引用。

要么

  • find名为HKEY_CLASSES_ROOT \ CLSID {……} \ InprocServer32的密钥。 这个键将把DLL的文件名作为默认值。
  • 我删除了HKEY_CLASSES_ROOT \ CLSID {……}文件夹。

注册为32bit:

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

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

要更改为x86:

  1. 为您的解决scheme创build一个安装项目。
  2. 创build后,转到解决scheme资源pipe理器,右键单击安装项目。
    • 按configurationpipe理器。
    • 点击:“Active Solution Platform”combobox并selectNew(如果没有显示x86)
    • 从第一个组合x86中select,然后按OK。
    • 重build安装项目,然后重build所有的项目。

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

对于任何使用VSTO的人来说,对我来说这个问题是缺less对officeassembly的参考。 如果您尝试手动实例化某些VSTO对象,也会出现这种情况。

在我个人的情况下,这个问题是固定的searchWindowsregistry中的开发人员的机器上的类ID(因为问题是抛出在客户端PC)。 这个动作将被放置到导致问题的COM组件中: 在我的.NET项目中引用的一个x86库,它没有被注册为安装程序或更新程序的OCX / COM

问候

我的问题是我的项目引用中有错误的MS Sync FrameWork版本(1.0)。 更新到2.1版之后,错误消失了,生活又恢复了良好。