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位上出错。您需要为
该网站可能以32位进程的形式运行,这就是它可以使用该组件的原因。针对
我遇到了一个非常相似的问题。
我需要在64位计算机上开发的Web应用程序中使用旧的32位DLL。我使用该文件夹中的regsrv32版本将32位dll注册到windowssysww64文件夹中。
对第三方dll的调用通过Visual Studio中的单元测试工作,但在同一台计算机上的IIS中承载的Web应用程序失败,错误为80040154。
将应用程序池更改为"启用32位应用程序"解决了此问题。
您不必配置项目属性平台目标x86。您还可以将IIS选项配置为使用类似x86的选项。
- 选择应用程序池
- 选择应用程序使用的池
- 高级设置
- 启用32位应用程序真
如果您正在寻找一种在不重新编译任何CPU应用程序的情况下工作的方法,下面是另一种潜在的解决方法:
我不相信这个解决方案,但它对我们有用。有关详细信息和其他注释,请查看源链接。
来源:https://techtalk.gfi.com/32bit-object-64bit-environment/
问题是服务器进程是64位的,库是32位的,它试图在同一进程(进程内服务器)中创建COM组件。要么重新编译服务器并将其设为32位,要么保持服务器不变并使COM组件退出进程。使COM服务器脱离进程的最简单方法是创建一个COM+应用程序-控制面板->管理工具->组件服务。
我没有更改任何编译设置。
只需在AppPool高级设置中设置"启用32位应用程序=真"。
它对我有用
Windows 2008 Server x64的解决方案是:
这个程序有效,没问题。
我有同样的问题,但其他答案只提供了解决方案的一部分。
解决方案有两个方面:
从寄存器中取出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的人来说,我的问题是缺少对
在我个人的例子中,这个问题被修复了,在开发人员机器上的Windows注册表中搜索类ID(因为这个问题是在客户机上抛出的)。此操作将被放置到导致此问题的COM组件中:我的.NET项目中引用的x86库未注册为安装程序或更新程序应用程序的ocx/com。
当做
在我的例子中,我正在生成像
我的错误消息显示
我的问题是在我的项目引用中使用了错误的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(如果是由错误注册引起的)不应再次发生。