将CoCreateInstance重定向到伪造的实现

时间:2019-06-04 04:02:54

标签: c++ winapi com

给出一些调用CoCreateInstance来创建注册的COM对象实例的现有代码,有没有办法重定向这些调用来创建另一个实例?

这个想法是,在同一流程中(出于测试目的),并且在不更改原始代码或不影响任何其他流程的情况下,当它请求系统提供的CLSID_ShellLink时(例如),它将创建一个实现相同接口的自定义类型(在同一代码库中实现)的实例,而不是通常创建的“真实”实例。

为澄清起见:我正在寻找一个可以说“嘿CoCreateInstance的API调用,先调用此本地对象以创建实例,然后再查看注册信息”。而且,它一定是可以通过编程方式完成的工作,而不是通过操纵注册表或配置文件来完成的。它需要在代码内可切换。

4 个答案:

答案 0 :(得分:2)

如果正在创建的对象正在处理中,并且如果可以在您正在谈论的过程中调用CoRegisterClassObject,则可以为特定对象注册自己的类工厂...也取决于调用CoCreateInstance时使用的标志

答案 1 :(得分:1)

这似乎是COM内部要实现的事情,因为它具有查找表和远程计算机挂钩以及其他各种奇怪而奇妙的东西。基本上,这只是另一种对象工厂。

尽管如此,至少到目前为止,我只是使用API​​拦截器来钩住CoCreateInstance本身并将其重定向到自定义函数。可以。

如果有人知道在COM本身内执行此操作的Right Way™,我将将此公开保留更长的时间。

答案 2 :(得分:1)

  

如果有人知道在COM本身内执行此操作的Right Way™,我将将此公开保留更长的时间。

上面by xMRi中提到了其中一种方法,当您需要在范围内重新定义实例化时,该方法特别有用。

另一种真正的COM方法是进行“处理为”仿真。 MSDN上的CoTreatAsClass function具有API本身,“备注”部分提供了很好的描述。

启用后,对给定CoCreateInstance的{​​{1}}的请求将重定向到新的仿真CLSID

答案 3 :(得分:0)

由于COM创建基于CLSID注册,因此您可以使用自己的代理类覆盖已知的CLSID。但是,这不受支持,并且可能导致不确定的行为。另外,这取决于CoCreateInstance的调用方式(CLSCTX枚举)。