c# - 由非托管 (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 做了什么改变导致了这个问题,有没有办法解决它?
谢谢!
解决方案
考虑使用“并排”程序集。基本上,您为您的程序创建一个指向本地私有(非管理员要求)COM 对象存储的 .NET 样式应用程序清单,并且 COM 管道在实例化 COM 工厂/COM 之前在 HKLM/HKCR 中查找之前查找那里目的。它从 Win2K 或 WinXP 时代就已经存在,但并不为人所知。
推荐阅读
- c# - PUN OnPlayerPropertiesChanged 和对象启用
- javascript - Express.js 代码上的 Windows 脚本宿主错误 800A03EA
- xaml - 搜索结果 TextHighlighter 或 TextRange 是否可以绑定到 UWP XAML 中的 DataTemplate?
- apache - ZShmStorage():致命错误:分配信号量失败。没有权限
- airflow - 带有 TypeError 的气流分支错误:“NoneType”对象不可迭代
- ios - 如何在 Firebase 中使用嵌套数据查询OrderedbyChild 和 queryEqualtoValue?
- excel - 如何在特定工作表列上结束 VBA?
- android - 我需要创建 Android 键盘应用程序,但有些类已被弃用
- facebook - 如何在 unity3d webGL 中进行正确的 facebook 支付?
- angular - 在angular8中使ngModel输入大写的正确方法是什么?