首页 > 解决方案 > 由非托管 (C++) COM 服务器实例化的托管 (C#) 控件在 Windows 更新后中断

问题描述

我开发了一个托管 (C#) 控件,将由非托管 (C++) COM 客户端使用。

由于我不能强制用户提升他们的权限(即使是安装),所以不能使用提升的(管理员)帐户注册控件,而必须由普通的非提升用户帐户注册。同样,非托管应用程序必须使用非提升的用户帐户运行。

因此,我设计了注册,以便在 HKEY_CURRENT_USER\Software\Classes\ (HKCU) 下添加注册表项。这些注册表项随后被 Windows 视为 HKEY_CLASSES_ROOT (HKCR) 配置单元的一部分。

这多年来一直很好,但在上个月,我看到 Windows 7 Professional 在实例化此控件时已开始报告 E_CLASSNOTREGISTERED。

当注册到 HKEY_LOCAL_MACHINE\Software\Classes\ (HKLM) 时,即使来自 HKCR 的视图在两种情况下都是相同的,也可以实例化控件。

由此我只能得出结论,Windows 正在寻找 HKLM 来查找我的控件的注册表信息,即使是从非提升的 COM 客户端(?!)。

这是新行为,仅在安装了 Microsoft 最新软件补丁的 Windows 7 计算机上发生。未打补丁的机器按预期工作(即我可以在 HKCU 注册时实例化我的控件)。

这是一个严重的问题。

有谁知道 MS 做了什么改变导致了这个问题,有没有办法解决它?

谢谢!

标签: c#c++windowscomregistry

解决方案


考虑使用“并排”程序集。基本上,您为您的程序创建一个指向本地私有(非管理员要求)COM 对象存储的 .NET 样式应用程序清单,并且 COM 管道在实例化 COM 工厂/COM 之前在 HKLM/HKCR 中查找之前查找那里目的。它从 Win2K 或 WinXP 时代就已经存在,但并不为人所知。


推荐阅读