Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当注册的名称不唯一时,有没有办法从ROT中获取对象?_C#_.net_Winapi_Com_Com Interop - Fatal编程技术网

C# 当注册的名称不唯一时,有没有办法从ROT中获取对象?

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#)。此应用程序可能有多个实例正在运行。不幸的是,此应用程序总是以完全相同的名称在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.


    祝你好运,
    布莱斯

很明显,该应用程序表明,无论您使用哪种应用程序,任何实例都可以处理您的请求。如果它很重要,那么它将被编写为使用更好的名字或强制使用单实例。。。我不想弄乱“应用程序”的其他实例(可能是由其他程序启动的)。我需要挂回“我”之前启动的“应用程序”的特定实例(我唯一地标识流程PID和流程启动时间)。有了“应用程序”对象,我可以得到一个windows句柄,它给了我一个PID,我可以从中检查进程开始时间,并知道该实例是“我的”。它像一个champ一样工作,但目前,我只能检查第一个实例。结果是,没有办法这样做。应用程序必须唯一注册,否则您就倒霉了。