我想截取COM CoCreateInstanceEx和/或CoGetClassObject函数,在单元测试中用测试垫片替换类。这只适用于单个CLSID;所有其他人都可以保持不变。有没有办法在没有可怕的,邪恶的黑客的情况下做到这一点?
答案 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()
时,通过该键映射库。