如何修复 COMException 错误 80040154?

Posted

技术标签:

【中文标题】如何修复 COMException 错误 80040154?【英文标题】:How to repair COMException error 80040154? 【发布时间】:2011-11-04 01:54:48 【问题描述】:

将工作中的 C# 项目从 64 位 Windows 7 机器移动到 32 位 XP 机器会导致以下错误:

Retrieving the COM class factory for component with CLSID 681EF637-F129-4AE9-94BB-618937E3F6B6 failed due to the following error: 80040154.

681EF637-F129-4AE9-94BB-618937E3F6B6 不在注册表中,因此未正确安装,但这是以前在 64 位 Windows 7 计算机上出现问题的同一 ID。

在 64 位 Windows 7 机器上找到了此错误的解决方案here(将 Platform Target 更改为 x86),但这并不能解决 32 位 XP 机器上的问题。

如何找到与681EF637-F129-4AE9-94BB-618937E3F6B6 关联的 DLL,或者更好的是,如何修复此异常?

【问题讨论】:

据我所知,进程(64 或 32)无法加载 32 位 dll(分别为 32 或 64)。 请注意,错误代码是 REGDB_E_CLASSNOTREG。因此,当计算机上未安装 COM/ActiveX 控件或因进程位数未安装 COM/ActiveX 控件时,可能会发生这种情况。 【参考方案1】:

要查找 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 进行注册。

【讨论】:

【参考方案2】:

我在 Windows 服务中遇到了同样的问题。注册表中正确位置的所有键。该服务的构建是为 x86 完成的,但我仍然遇到异常。我发现了CorFlags.exe

在您的 service.exe 上运行此程序,不带标志来验证您是否在 32 位下运行。如果不使用标志 /32BIT+ /Force 运行它 (仅对签名程序集强制)

如果您启用了 UAC,您可能会收到以下错误:corflags : error CF001 : Could not open file for writing 让用户完全控制程序集。

【讨论】:

你能澄清一下 - 截图是图像标志应该是什么?还是屏幕截图的情况给您带来了问题?我得到了海报的 COMException 并且我的可执行文件具有与屏幕截图中完全相同的标志。 @CalvinFisher 这是应该的截图。 (就我而言)【参考方案3】:

解决方法:

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

根本原因

VSS 互操作是一个使用 32 位框架的托管程序集,并且 dll 包含一个 32 位 COM 对象。如果你在 64 位环境下运行这个 COM dll,你会得到错误信息。

【讨论】:

这对我有用。示例 exe 可以工作,但是当我编译代码并尝试新的 exe 时,我收到了 COM 错误。 SDKTestPlus3.exe 运行良好。只有我编译的 exe 不起作用。在将VS更改为构建x86而不是Any CPU之后,编译的exe终于可以工作了。谢谢!【参考方案4】:

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

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

以上两行在我的表单中声明为全局,因此我将这两行移至本地函数,现在工具工作正常。

【讨论】:

以上是关于如何修复 COMException 错误 80040154?的主要内容,如果未能解决你的问题,请参考以下文章

当我浏览 http://localhost:8004/elmah.axd 时,它会生成 404 错误

仅在 VS 2010 上运行时:COMException:灾难性故障:错误代码:-2147418113

COMException 未知错误 (0x80005000) - DirectoryServices

IMAPI:COMException 发生内部文件系统错误 [-1062555360]

尝试在 C# 中使用 ActiveX 控件加载 PDF 文件时出现 COMException 错误

通过 COM 读取 Office PPT 文件提示 COMException 错误码 0x80004005 可能原因