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

Iga*_*nik 5 com registry clsid

我正在查看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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rom*_* R. 2

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

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