代码之家  ›  专栏  ›  技术社区  ›  bdonlan

有没有办法钩住或拦截CoGetClassObject和/或CoCreateInstance调用?

  •  7
  • bdonlan  · 技术社区  · 16 年前

    我想截取通讯 CoCreateInstanceEx 和/或 CoGetClassObject 用于在单元测试中用测试垫片替换类的函数。这将仅适用于单个CLSID;所有其他人都可以一成不变地通过。有没有一种方法可以在没有可怕邪恶黑客的情况下做到这一点?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Kim Gräsman    16 年前

    总有这样的问题 CoTreatAsClass 功能: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx

    或者,您可以按照Shay Erlichmen评论中引用的帖子中的建议,研究挂钩CoCreateInstance。

        2
  •  2
  •   sharptooth    16 年前

    这取决于你到底想要什么。

    如果您想检测谁正在加载该类,或者想知道是否已经加载了该类,那么您可以使用 Process Monitor CoGetClassObject() (或 CoCreateInstanceEx() )将导致 HKCR\CLSID\{Class of interest id} 正在读取的键和过程监视器将向您显示什么过程、何时执行以及它的成功程度。

    如果您想用自己的类替换现有的类,请使用具有相同类id的类版本编译一个库,并更改其中COM服务器的路径 HKCR\CLSID\{兴趣类别id} 因此,您的库用于为具有该id的类提供服务。您可以手动或使用regsvr32执行此操作-首先注册原始库,然后注册您的库以覆盖感兴趣的类注册。COM没有类id->当使用者调用时,通过该键的库映射 CoGetClassObject() .

    推荐文章