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

实例化COM Interop对象时:

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)). 

我以“以管理员身份运行”启动应用程序时出现此错误。 当我正常运行时,不会发生错误。

笔记:

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

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

我尝试过的:

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

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

您在没有管理权限的情况下为本地用户帐户注册了对象,而不是从管理进程注册。 因此,COM组件在注册表的用户特定区域下注册(如您所示:HKC * U *)。

如果进程在没有管理权限的情况下运行,则会显示HKCR注册表的合并视图,其中包括所有HKCU \ Software \ Classes条目以及尚未在HKCU \ Software \ Classes中重写的HKLM \ 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组件是如何注册的?