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

时间:2009-10-22 03:42:39

标签: windows unit-testing com hook shim

我想截取COM CoCreateInstanceEx和/或CoGetClassObject函数,在单元测试中用测试垫片替换类。这只适用于单个CLSID;所有其他人都可以保持不变。有没有办法在没有可怕的,邪恶的黑客的情况下做到这一点?

2 个答案:

答案 0 :(得分:3)

始终有CoTreatAsClass功能: http://msdn.microsoft.com/en-us/library/ms693452(VS.85).aspx

但是,正如您所指出的,它将是整个系统的替代,而不是本地更改。

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

答案 1 :(得分:2)

这取决于你想要什么。

如果要检测谁正在加载该类或查找是否已加载该类,则可以使用Process Monitor。对CoGetClassObject()(或CoCreateInstanceEx())的调用将导致读取HKCR\CLSID\{Class of interest id}密钥,Process Monitor将向您显示此过程以及过何时间和成功程度。

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