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

我想拦截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。