"以管理员身份运行"时,实例化COM组件失败并显示"未注册类"

Mat*_*ith 5 c# com com-interop

实例化COM Interop对象时:

var comObj = new ComComponentClass();
Run Code Online (Sandbox Code Playgroud)

我明白了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 Code Online (Sandbox Code Playgroud)

当我启动我的申请得到这个错误,以管理员身份运行.当我正常运行时,不会发生错误.

笔记:

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

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

我尝试过的:

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

  • 在这两种情况下,通过检查密钥来定位适当的dll HKCU\Software\Classes\CLSID\{C343ED84-A129-11d3-B799-0060B0F159EF}\InprocServer32
  • 在这两种情况下,它都会查询密钥HKCR\CLSID\{C343ED84-A129-11D3-B799-0060B0F159EF}并返回NAME NOT FOUND.我发现这很奇怪(因为我可以找到该密钥使用regedit.exe.但由于这两种情况之间没有区别,所以它似乎并不重要.

Eur*_*lli 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组件是如何注册的?