通过Windows进程句柄访问COM对象

时间:2010-04-30 18:02:32

标签: c# com interop

我目前正在使用COM自动化应用程序,并且如果原始应用程序在我的应用程序运行时已经打开,那么使用我的应用程序的任何人都会遇到问题。我知道如果它是打开的,如何找到它,但不必担心关闭它,或解决它等等,我想尝试使用现有的应用程序,而不是打开一个新的应用程序。

这就是我通常在自动化程序中启动应用程序的方法:

Designer.Application desApp = new Designer.Application();

现在我试图尝试使用现有应用程序中的句柄:

Designer.Application desApp = (Designer.Application)((System.Diagnostics.Process.GetProcessesByName("Designer.exe")[0]).Handle)

(我知道这不起作用,因为.Handle会返回IntPtr,但我正在使用它作为示例。)

有没有办法实现这个目标?如果我知道句柄/进程,如何返回可用对象?

2 个答案:

答案 0 :(得分:3)

附加到现有自动化对象的COM方式检索运行对象表(ROT)http://msdn.microsoft.com/en-us/library/ms695276(VS.85).aspx的对象。

您可以使用IRunningObjectTable接口在ROT中注册COM对象。 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comtypes.irunningobjecttable.aspx

用于查询ROT以查找对象的现有实例。例如,System.Runtime.InteropServices.Marshal.GetActiveObject。

答案 1 :(得分:2)

您无法在客户端代码中执行此操作,必须在服务器中处理它。服务器必须调用CoRegisterClassObject(),传递REGCLS_MULTIPLEUSE,以便允许多个客户端使用单个服务器实例。没有其他机制允许客户端获取指向Application对象的接口指针。

这非常符合设计,必须设计和编写服务器以支持此类用法。它不能在以后用螺栓固定。