5

我正在查看vsjitdebugger.exe使用Process Monitor的注册表访问,我注意到有时它以以下方式查询注册表(省略了一些信息):

HKCU\Software\Classes\CLSID\{some-guid} NAME NOT FOUND  Desired Access: Read
...
HKCU\Software\Classes\CLSID\{some-guid}\TreatAs NAME NOT FOUND  Desired Access: Query Value
...
HKCU\Software\Classes\CLSID\{some-guid}\InprocServer32  NAME NOT FOUND  Desired Access: Read
...
HKCR\CLSID\{24E669E1-E90F-4595-A012-B0FD3CCC5C5A}\InprocServer32    SUCCESS Desired Access: Read

MSDN 上有关 TreatAs 的信息表明,它允许为另一个 COM 服务器指定 GUID,而不是原始的。

我无法找到有关此密钥的更多信息,也无法在我自己的 COM 对象上使用它:我有同一个 COM 对象的两个不同实现(在 2 个单独的 DLL 中,有 2 个单独的 GUID) ,并且当我的进程通过 GUID 创建对象时,我希望它改为创建另一个对象(通过 TreatAs 中指定的 GUID)。不幸的是,Windows 似乎立即尝试查询HKCU\Software\Classes\CLSID\{my-guid}\InprocServer32,而不是首先寻找 TreatAs。

我的问题基本上是关于 TreatAs 的规则,何时以及如何查询它?

4

1 回答 1

2

TreatAs功能的工作非常简单:通过对 COM 对象实例的请求CoCreateInstance,COM 子系统检查 TreatAs 键,并在找到时尝试实例化替换/仿真类并透明地返回它而不是请求的 CLSID。因此,调用者透明地获得了仿真对象的接口。

该功能很少使用,但仍然使用。您可以使用EnumerateTreatAsClasses实用程序枚举当前活动的 TreatAs 类。该功能是挂钩 COM 类实例化的方法之一。

于 2013-06-16T18:42:18.923 回答