代码之家  ›  专栏  ›  技术社区  ›  Igal Tabachnik

COM如何(以及何时)工作?

  •  5
  • Igal Tabachnik  · 技术社区  · 14 年前

    我正在查看的注册表访问 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
    

    有关的信息 TreatAs on MSDN 显示它允许为将调用的另一个COM服务器(而不是原始服务器)指定一个GUID。

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

    我的问题基本上是关于治疗规则,何时以及如何被质疑?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Roman Ryltsov    11 年前

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

    该功能很少使用,但仍在使用。您可以使用枚举当前活动的treatas类 EnumerateTreatAsClasses 实用性。这个特性是挂接COM类实例化的方法之一。

    推荐文章