COM TreatAs如何(以及何时)起作用?

时间:2010-11-23 09:46:18

标签: com registry clsid

我正在使用Process Monitor查看vsjitdebugger.exe的注册表访问权限,我注意到有时它以下列方式查询注册表(某些信息已忽略):< / p>

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

相关问题