C# 当注册的名称不唯一时,有没有办法从ROT中获取对象?
我需要获取一个运行对象的特定实例(从c#)。此应用程序可能有多个实例正在运行。不幸的是,此应用程序总是以完全相同的名称在ROT中注册(例如“!{DED89DB0-45B6-11CE-B307-0800363A1E02}”)。我可以使用所示的技术迭代ROT并找到我的应用程序的唯一实例,但是当我在IRunningObjectTable实例上使用GetObject方法时,它总是返回注册的第一个对象C# 当注册的名称不唯一时,有没有办法从ROT中获取对象?,c#,.net,winapi,com,com-interop,C#,.net,Winapi,Com,Com Interop,我需要获取一个运行对象的特定实例(从c#)。此应用程序可能有多个实例正在运行。不幸的是,此应用程序总是以完全相同的名称在ROT中注册(例如“!{DED89DB0-45B6-11CE-B307-0800363A1E02}”)。我可以使用所示的技术迭代ROT并找到我的应用程序的唯一实例,但是当我在IRunningObjectTable实例上使用GetObject方法时,它总是返回注册的第一个对象 有没有办法获取对该特定对象的引用?如此接近,但到目前为止……这是一件相当复杂的事情,没有真正的解决办法。
有没有办法获取对该特定对象的引用?如此接近,但到目前为止……这是一件相当复杂的事情,没有真正的解决办法。我们在其中一个项目中解决这个问题的方法如下:
-需要在C++中创建和应用程序(.NET太高),用自己的方法重写RealStAcServices对象和ReVoCukAvestObjt,安装一个钩子。 -您需要在启动应用程序之前启动应用程序。
-启动代码时,它将侦听事件以在ROT中创建新对象
-您的代码需要拦截(覆盖RegisterActiveObject)
-检查注册对象是否是您感兴趣的对象
-如果是,则可以修改其名称(例如,在末尾添加PID)并添加到ROT
-现在您有了以下元素
!!{DED89DB0-45B6-11CE-B307-0800363A1E02}
!{DED89DB0-45B6-11CE-B307-0800363A1E02}
!{DED89DB0-45B6-11CE-B307-0800363A1E02} !{DED89DB0-45B6-11CE-B307-0800363A1E02}
- 现在,最后2个条目指向应用程序的不同实例,您可以通过名称从ROT获得它。当然,添加PID只是一个例子,您可以根据需要修改名称(只要名称保持唯一-这就是重点)。
查看psapi.h和dbghelp.h.
祝你好运,
布莱斯