我目前正在使用COM自动化应用程序,并且如果原始应用程序在我的应用程序运行时已经打开,那么使用我的应用程序的任何人都会遇到问题。我知道如果它是打开的,如何找到它,但不必担心关闭它,或解决它等等,我想尝试使用现有的应用程序,而不是打开一个新的应用程序。
这就是我通常在自动化程序中启动应用程序的方法:
Designer.Application desApp = new Designer.Application();
现在我试图尝试使用现有应用程序中的句柄:
Designer.Application desApp = (Designer.Application)((System.Diagnostics.Process.GetProcessesByName("Designer.exe")[0]).Handle)
(我知道这不起作用,因为.Handle
会返回IntPtr
,但我正在使用它作为示例。)
有没有办法实现这个目标?如果我知道句柄/进程,如何返回可用对象?
答案 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对象的接口指针。
这非常符合设计,必须设计和编写服务器以支持此类用法。它不能在以后用螺栓固定。