当注册名称不唯一时从 ROT 获取对象的任何方法

本文关键字:获取 ROT 取对象 方法 任何 注册 唯一 | 更新日期: 2023-09-27 17:57:20

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

有没有办法获取对该特定对象的引用? 如此之近,却又如此遥远...

当注册名称不唯一时从 ROT 获取对象的任何方法

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

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

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

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


    查看 psapi.h 和 dbghelp.h。


    祝你好运
    布莱斯