我正在使用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的规则,何时以及如何被查询?
答案 0 :(得分:2)
TreatAs 功能非常简单:通过向CoCreateInstance
请求COM对象的实例,COM子系统检查TreatAs密钥,并在找到时尝试实例化替换/仿真class并透明地返回它而不是请求CLSID。因此,调用者透明地获得仿真对象的接口。
该功能很少使用,但仍在使用。您可以使用EnumerateTreatAsClasses实用程序枚举当前活动的TreatAs类。该功能是挂钩COM类实例化的方法之一。