我正在尝试设计一个可以在任何不同的应用程序上识别COM对象及其属性的应用程序。这是我第一次尝试这样做,而且我不确定从哪里开始。理想情况下,它将使用Delphi XE2制作,但我愿意接受建议。
如果我有CLSID,有没有办法“扫描”正在运行的应用程序以查找基于它的对象?或者,换句话说,有没有更好的方法在任何正在运行的应用程序中列出/查找活动对象?
非常感谢任何帮助,以及关于该主题的良好文档的任何指示。
编辑:问题实际上是在任何其他应用程序中查找COM对象,列出属性以及我需要的其他问题已在其他问题中得到解答。
答案 0 :(得分:6)
无法扫描正在运行的COM对象。一旦它们被实例化 - 它们只是由其他东西引用的内存块(成员接口指针变量等)。
有时会将对象放在运行对象表(ROT
)上,您可以从那里检索它们,如评论中已建议的那样。这个属性可以说是< 1%的COM对象实例,但也许你很幸运能够追逐那些。
我能想到的唯一方法是挂钩COM对象实例化,以便您拦截创建,然后能够跟踪您自己的现有实例列表。这也不是一种简单的方法(也很可能是不安全的)。
要实现这一点,您需要在您感兴趣的CLSID
的运行过程的上下文中注册您的类对象,并让您的类工厂接收实例化调用。或者,挂钩CoCreateInstance
API,例如Detours
。
一旦你挂钩实例化,你就会在创建对象时有指针,你又需要对它们做一些事情。您可能希望将这些实例化调用转发到原始API,然后跟踪实例的生命周期 - 如果您对该对象进行额外引用,则可能会改变应用程序的原始行为。否则,您无法控制COM对象释放。有时可以聚合创建COM类,您可以或多或少地将原始实例简洁地嵌入COM对象中。
总而言之,一般来说,任务似乎不可行。具有特定的CLSID
感兴趣,虽然有一定的运气和相当大的努力,但您可能会成功地做到这一点。