【问题标题】:How to repair COMException error 80040154?如何修复 COMException 错误 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 控件时,可能会发生这种情况。

标签: .net exception com dllregistration


【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2012-12-14
      • 1970-01-01
      • 2015-12-04
      • 2016-11-17
      • 2011-07-24
      相关资源
      最近更新 更多