【问题标题】:Is there a way to hook or intercept CoGetClassObject and/or CoCreateInstance calls?有没有办法挂钩或拦截 CoGetClassObject 和/或 CoCreateInstance 调用?
【发布时间】:2010-12-08 23:04:24
【问题描述】:

我想拦截 COM CoCreateInstanceEx 和/或 CoGetClassObject 函数,以在单元测试中用测试填充程序替换一个类。这仅适用于单个 CLSID;所有其他人都可以通过不变。有没有办法在没有可怕的、邪恶的黑客攻击的情况下做到这一点?

【问题讨论】:

  • @Shay,确实如此。我已投票支持将其作为骗子关闭,但显然仅提问者投票关闭是不够的(我不想删除,因为它可能有助于将来有人搜索)
  • 不是重复的。这个问题是在监视 COM 对象。这个问题是针对单元测试的。前者试图通过挂钩 CoCreateInstance 来解决问题——这并不意味着它必须是答案。这个问题想钩 CoCreateInstance。

标签: windows unit-testing com hook shim


【解决方案1】:

总是有CoTreatAsClass 函数: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx

但是,正如您所指出的,它将是类的系统范围的替换,而不是本地更改。

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

【讨论】:

    【解决方案2】:

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

    如果您想检测谁在加载该类或查找它是否已加载,您可以使用Process Monitor。对CoGetClassObject()(或CoCreateInstanceEx())的调用将导致读取HKCR\CLSID\{Class of interest id} 密钥,并且进程监视器将向您显示这是什么进程,何时执行以及它有多成功。

    如果你想用你的类替换现有的类 - 用你的类版本和相同的类 id 编译一个库,并更改HKCR\CLSID\{Class of interest id} 内的 COM 服务器的路径,以便你的库用于为类提供服务那个身份证您可以手动或使用 regsvr32 执行此操作 - 首先注册原始库,然后您的以覆盖感兴趣的类注册。当消费者调用 CoGetClassObject()CoCreateInstanceEx() 时,COM 通过该键执行类 id -> 库映射。

    【讨论】:

    • 不幸的是,我不能为此乱搞注册表——它将在自动化测试套件上运行,我打算覆盖的类是CLSID_KnownFolderManager,所以它可能以系统范围的方式覆盖它是一个坏主意:) 在最坏的情况下,我可以检测要测试的代码,但如果有一种干净的方法可以仅为一个进程替换它,那就太好了。
    • 首先,您可以在测试套件运行后注册原始库,这将恢复理智。其次,您可以仅为当前用户注册修改后的库 - 修改 HKCU\Software\Classes\CLSID。除此之外,你不能做任何或多或少优雅的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多