5

实例化 COM 互操作对象时:

var comObj = new ComComponentClass();

我得到COMException

Retrieving the COM class factory for component with CLSID 
{C343ED84-A129-11D3-B799-0060B0F159EF} failed due to the following error: 
80040154 Class not registered 
(Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

当我使用Run as Administrator启动我的应用程序时,我只会收到此错误。当我正常运行时,不会发生错误。

笔记:

  • 该应用程序是 64 位应用程序。
  • COM 组件是 64 位 dll 中的 inproc 服务器。

关于我应该从哪里开始调查为什么会出现这种差异的任何想法?

我试过的:

我使用 Procmon 来查看它检查的注册表项。

  • 在这两种情况下,通过检查密钥来定位适当的 dllHKCU\Software\Classes\CLSID\{C343ED84-A129-11d3-B799-0060B0F159EF}\InprocServer32
  • 在这两种情况下,它都会查询密钥HKCR\CLSID\{C343ED84-A129-11D3-B799-0060B0F159EF}并返回NAME NOT FOUND。我觉得很奇怪(因为我可以使用regedit.exe.
4

1 回答 1

4

您在没有管理权限的情况下为您的本地用户帐户注册了对象,而不是从管理过程中这样做。因此,COM 组件在注册表的用户特定区域下注册(正如您自己指出的那样: HKC* U * )。

当进程在没有管理权限的情况下运行时,会显示 HKCR 注册表的合并视图,其中包括所有 HKCU\Software\Classes 条目以及 HKLM\Software\Classes 中尚未在 HKCU\Software\Classes 中覆盖的任何内容. 当进程以管理员身份运行时,注册表仅显示 HKLM\Software\Classes 条目。

有关详细信息,请参阅此链接:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms724498 (v=vs.85).aspx

奇怪的是,RegSvr32 不会在 HKCU\Classes 键下注册。如果您在没有管理权限的情况下运行它,它只会失败(在 Windows 7 中检查以确保)。COM 组件是如何注册的?

于 2013-03-25T18:53:03.013 回答