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

本文关键字:运行 身份 管理员 类未注册 失败 组件 COM 提示 实例化 注册 | 更新日期: 2023-09-27 18:05:37

实例化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)).

只有得到这个错误,当我启动我的应用程序与运行管理员。当我正常运行时,没有出现错误

指出:

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

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

我试过了:

我已经使用Procmon来观察它检查的注册表项。

  • 在这两种情况下,通过检查键HKCU'Software'Classes'CLSID'{C343ED84-A129-11d3-B799-0060B0F159EF}'InprocServer32
  • 来定位适当的dll
  • 在这两种情况下,它查询键HKCR'CLSID'{C343ED84-A129-11D3-B799-0060B0F159EF}并得到NAME NOT FOUND。我觉得很奇怪(因为我可以使用regedit.exe找到那个键。但由于这在两种情况下并没有什么不同,所以它似乎并不重要。

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

您为没有管理权限的本地用户帐户注册了对象,而不是从管理进程注册。因此,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中只是检查以确保)。