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

bdo*_*lan 7 windows com hook unit-testing shim

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

sha*_*oth 2

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

如果您想检测谁正在加载该类或查找它是否已加载,您可以使用Process Monitor。调用CoGetClassObject()(或CoCreateInstanceEx()) 将导致HKCR\CLSID\{Class of interest id}读取密钥,进程监视器将向您显示哪个进程、何时执行此操作以及其成功程度。

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