为具有进程ID或MainWindowHandle的多个实例查找COM对象(Corel.Application)

时间:2017-01-24 20:00:45

标签: com pid comobject

我有一个Client Server应用程序正在执行下一步:
服务器启动并侦听特定端口。 许多corelDraw sesions手动或以编程方式启动。每个corel会话(客户端)连接到发送当前进程ID的服务器。服务器将所有连接保存在listView中,并根据EndPoint可以更改(发送和接收)消息的每个连接。 现在我想使用特定此类进程ID的COM对象。 我试过了:

using corel = Corel.Interop.VGCore;

int processID = Convert.ToInt32(lstClients.SelectedItems[0].SubItems[4].Text);//process ID string
Process corProc = Process.GetProcessById(processID);
int hwnd = (int)Process.GetProcessById(corProc).MainWindowHandle
this.Activate();
bool IsCom = corProc.GetType().IsCOMObject; // return false...
corApp = (corel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Corel.Application") // returns just the last session (not according to existing process ID
//tried also:
corApp = (corel.Application)System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(corProc.Handle); // error...
//tried:
corApp = (corel.Application)Convert.ChangeType(corProc, typeof(corel.Application)); // error: 'Object must implement IConvertible.'

有没有办法获得corel COM对象给我机会这样使用Corel.Application对象?

MessageBox.Show(corApp.Documents.Count.ToString());

提前致谢!

1 个答案:

答案 0 :(得分:0)

没有通用机制从PID获取对象,但是根据OLE服务器的实现,您可以使用AccessibleObjectFromWindow。有关针对PowerPoint的类似示例,请参阅Launching Office Apps Programmatically

您也可以try using RotView查看应用程序是否已在运行对象表中注册。例如,Visual Studio使用!VisualStudio.DTE.14.0:21604的名字对象注册,其中14.0是版本,21604是进程ID。

ROTView showing a VisualStudio entry with the process id