7

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

4

2 回答 2

3

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

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

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

于 2009-10-22T11:13:04.690 回答
2

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

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

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

于 2009-10-22T05:22:58.530 回答