Windows 更新后由非托管 (C++) COM 服务器实例化的托管 (C#) 控件损坏
Managed (C#) control instantiated by unmanaged (C++) COM Server broken after Windows update
我开发了一个托管 (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 客户端 (?!)。
这是新行为,只发生在 Windows 7 台安装了 Microsoft 最新软件补丁的机器上。未打补丁的机器按预期工作(即我可以在 HKCU 中注册时实例化我的控件)。
这是一个严重的问题。
是否有人知道 MS 所做的更改导致了此问题,是否有解决方法?
谢谢!
考虑使用 "side-by-side" assemblies。基本上,您为您的程序创建了一个 .NET 样式的应用程序清单,它指向一个本地私有(不需要管理员)的 COM 对象存储,并且 COM 管道在实例化 COM [之前先在 HKLM/HKCR 中查找 HKLM/HKCR =14=] 对象。它自 Win2K 或 WinXP 时代就已存在,但鲜为人知。
我开发了一个托管 (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 客户端 (?!)。
这是新行为,只发生在 Windows 7 台安装了 Microsoft 最新软件补丁的机器上。未打补丁的机器按预期工作(即我可以在 HKCU 中注册时实例化我的控件)。
这是一个严重的问题。
是否有人知道 MS 所做的更改导致了此问题,是否有解决方法?
谢谢!
考虑使用 "side-by-side" assemblies。基本上,您为您的程序创建了一个 .NET 样式的应用程序清单,它指向一个本地私有(不需要管理员)的 COM 对象存储,并且 COM 管道在实例化 COM [之前先在 HKLM/HKCR 中查找 HKLM/HKCR =14=] 对象。它自 Win2K 或 WinXP 时代就已存在,但鲜为人知。