我想拦截COM CoCreateInstanceEx和/或CoGetClassObject函数,以在unit testing中用testing填充replace类。 这只会是一个单一的CLSID; 其他人都可以不变。 有没有办法做到这一点,没有可怕的,邪恶的黑客?
这取决于你想要什么。
如果要检测是谁在加载该类,或者要查找是否加载了该类,则可以使用Process Monitor 。 对CoGetClassObject()
(或CoCreateInstanceEx()
)的调用将导致读取HKCR\CLSID\{Class of interest id}
键,并且Process Monitor将向您显示该进程以及何时执行此操作以及如何成功。
如果你想用你的类替换一个已经存在的类 – 用你的类的版本编译一个库,并且改变到HKCR\CLSID\{Class of interest id}
里的COM服务器的路径,这样你的库就可以用来用这个ID服务一个班级。 您可以手动或使用regsvr32来做到这一点 – 首先注册原始库,然后您可以覆盖感兴趣的类注册。 当消费者调用CoGetClassObject()
或CoCreateInstanceEx()
时,COM通过该键进行类id – >库映射。
总是有CoTreatAsClass
函数: http : //msdn.microsoft.com/en-us/library/ms693452( CoTreatAsClass
.aspx
但是,正如你所指出的那样,这将是整个系统的替代,而不是局部的变化。
或者,您可以像Shay Erlichmen的评论引用的帖子中所建议的那样查看连接CoCreateInstance。