2010-11-23 95 views
5

我一直在寻找的vsjitdebugger.exe注册表访问使用Process Monitor,我注意到有时它查询以下列方式注册表(一些信息被遗漏):COM TreatAs如何(以及何时)工作?

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。

我的问题基本上是关于治疗的规则,何时以及如何得到查询?

回答

2

TreatAs功能的工作原理很简单:一起CoCreateInstance请求的COM对象的实例,为TreatAs COM子系统检查重点,并发现时,尝试实例替换/仿真类,并透明地返回它,而不是要求CLSID。调用者因此透明地获得仿真对象的接口。

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

+0

即使我在3年前问过这个问题,我很欣赏答案:) – 2013-06-16 18:45:33

相关问题