如何修复COMException错误80040154?

41
将一个在64位Windows 7机器上工作的C#项目移植到32位XP机器上时,出现了以下错误:
“检索具有CLSID {681EF637-F129-4AE9-94BB-618937E3F6B6}的组件的COM类工厂失败,原因是以下错误:80040154。”
“681EF637-F129-4AE9-94BB-618937E3F6B6”不在注册表中,因此没有正确安装,但这与之前在64位Windows 7机器上遇到的问题相同。
解决64位Windows 7机器上的这个错误可以在这里找到(更改平台目标为x86),但这并不能解决32位XP机器上的问题。
我该如何找到与“681EF637-F129-4AE9-94BB-618937E3F6B6”相关联的DLL,或者更好的方法是如何修复这个异常?

据我所知,进程(64位或32位)无法加载32位dll文件(32位或64位)。 - Arun
1
请��意,错误代码为REGDB_E_CLASSNOTREG。因此,当计算机上未安装COM/ActiveX控件或未为进程的位数安装时,可能会出现此问题。 - Ritsaert Hornstra
4个回答

25

要找到DLL文件,请转到您的64位计算机并打开注册表。找到名为HKEY_CLASSES_ROOT\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32的键。此键将以其默认值形式包含DLL文件名。

如果您通过将项目重新编译为x86在64位机器上解决了问题,则需要查找注册表中32位部分而不是正常位置。这是HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{681EF637-F129-4AE9-94BB-618937E3F6B6}\InprocServer32

如果DLL为32位,则可以直接在32位机器上使用它。如果它是64位构建的,则必须与供应商联系并从他们那里获取32位版本。

当您拥有DLL时,请运行c:\windows\system32\regsvr32.exe进行注册。


14

我在Windows服务中遇到了同样的问题。注册表中所有键都放置正确。服务的构建是针对x86的,但仍然出现了异常。我发现了CorFlags.exe

在不带标志的情况下,在service.exe上运行它以验证是否在32位下运行。如果不是,则使用标志/32BIT+ /Force运行。(只有签名程序集才需要强制)

如果您打开了用户账户控制(UAC),则可能会出现以下错误:corflags : error CF001: Could not open file for writing。请给用户完全控制权限。

这是我的情况应该是这个样子的截图: Console output


8

解决方法:

可能的解决方法是将项目的平台从“任何CPU”修改为“X86”(在项目属性的“生成/平台目标”中)

根本原因

VSS Interop是一个使用32位框架的托管程序集,该dll包含一个32位COM对象。如果您在64位环境中运行此COM dll,则会收到错误消息。


这对我有用。示例exe可以工作,但是当我编译代码并尝试新的exe时,我收到了COM错误。SDKTestPlus3.exe可以正常工作。只有我的编译exe无法工作。将VS更改为构建x86而不是Any CPU后,编译的exe最终可以工作。谢谢! - Damon

-1

将在表单中全局声明的Excel变量移动到本地,就像在我的表单中一样:

Dim xls As New MyExcel.Interop.Application  
Dim xlb As MyExcel.Interop.Workbook

上述两行代码在我的表单中被声明为全局变量,所以我将这两行代码移动到本地函数中,现在工具可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接