当注册名称不唯一时,有什么方法可以从 ROT 获取对象?

Bam*_*a91 5 .net c# com winapi com-interop

我需要获取正在运行的对象的特定实例(来自 c#)。此应用程序可能有多个正在运行的实例。不幸的是,这个应用程序总是以完全相同的名称在 ROT 中注册(例如,“!{DED89DB0-45B6-11CE-B307-0800363A1E02}”)。我可以使用此处显示的技术遍历 ROT并找到我的应用程序的唯一实例,但是当我在 IRunningObjectTable 实例上使用 GetObject 方法时,它始终返回注册的第一个对象。

有没有办法获得对该特定对象的引用?这么近,却又这么远……

小智 3

这是一件非常复杂的事情,并且没有真正的解决方案。我们在一个项目中解决这个问题的方法如下:

- 您需要用 C++(.NET 级别太高)创建和应用程序,用您自己的方法覆盖 RegisterActiveObject 和 RevokeActiveObject,安装一个钩子。
- 您需要在启动应用程序之前启动应用程序。
- 当代码启动时,它将侦听事件以在 ROT 中创建新对象
- 您的代码需要拦截该事件(覆盖 RegisterActiveObject)
- 检查注册对象是否是您感兴趣的对象
- 如果是,那么您可以修改它` s 名称(例如通过在末尾添加 PID)并添加到 ROT
- 现在您有以下元素

!{DED89DB0-45B6-11CE-B307-0800363A1E02}
!{DED89DB0-45B6-11CE-B307-0800363A1E02}
!{DED89DB0-45B6-11CE-B307-0800363A1E02}_3365
!{DED89DB 0-45B6-11CE-B307-0800363A1E02}_4564

  • 现在最后 2 个条目指向应用程序的不同实例,您可以通过名称从 ROT 获取它。当然,添加 PID 只是一个示例,您可以根据需要修改名称(只要保持唯一 - 这就是重点)。


    查看 psapi.h 和 dbghelp.h。


    祝你好运,
    布莱斯