gpt4 book ai didi

c# - 由非托管 (C++) COM 服务器实例化的托管 (C#) 控件在 Windows 更新后损坏

转载 作者:行者123 更新时间:2023-11-30 04:58:53 24 4
gpt4 key购买 nike

我开发了一个托管 (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 的 View 在这两种情况下相同,也可以实例化该控件。

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

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

这是一个严重的问题。

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

谢谢!

最佳答案

考虑使用 "side-by-side" assemblies .基本上,您为您的程序创建一个 .NET 样式的应用程序 list ,它指向一个本地私有(private)(不需要管理员)的 COM 对象存储,并且 COM 管道在实例化 COM 工厂/COM 之前先在 HKLM/HKCR 中查找目的。它自 Win2K 或 WinXP 时代就已存在,但鲜为人知。

关于c# - 由非托管 (C++) COM 服务器实例化的托管 (C#) 控件在 Windows 更新后损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51502664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com