给定一些调用CoCreateInstance
以创建已注册COM对象实例的现有代码,是否有一种方法可以重定向这些调用以创建不同的实例?
这样做的想法是,在同一个过程中(为了测试目的),在不改变原始代码或影响任何其他进程的情况下,当它请求系统时--提供CLSID_ShellLink
(例如)--它将创建一个实现相同接口的自定义类型(在相同的代码库中实现)的实例,而不是它通常创建的“真实”实例。
需要澄清的是:我正在寻找一个API调用,这个调用可以用来表示“嗨,CoCreateInstance
,在查看注册之前先调用这个本地东西来创建一个实例”。而且它必须是可以通过编程完成的,而不是通过操作注册表或配置文件;它需要在代码中进行切换。
发布于 2019-06-03 21:04:10
这似乎是COM在内部实现的一种方式,因为它有查找表、远程计算机钩子以及其他各种奇怪和美妙的东西。它基本上只是一种不同类型的物体工厂。
不过,至少在目前,我只是使用了一个API拦截器来连接CoCreateInstance
本身并将其重定向到一个自定义函数。它起作用了。
如果有人知道™在COM内部进行这一操作的正确方法,我还会让它再开放一段时间。
发布于 2019-06-04 03:26:06
如果您正在创建的对象正在处理中,并且您可以在您正在讨论的进程中调用CoRegisterClassObject,则可以为该专门对象注册您自己的类工厂.还取决于调用CoCreateInstance时使用的标志。
发布于 2019-06-04 05:17:12
如果有人知道™在COM内部进行这一操作的正确方法,我还会让它再开放一段时间。
上面提到的其中一个方法是由xMRi,当您需要在范围内重新定义实例化时,它特别有用。
另一个真正的COM方法是进行“把它当作”模拟。MSDN上的CoTreatAsClass函数具有API本身的特性,备注部分给出了很好的描述。
启用后,在给定的CoCreateInstance
上对CLSID
的请求将重定向到新的仿真CLSID
。
https://stackoverflow.com/questions/56437191
复制