2017-01-24 47 views
0

我有一個客戶端服務器應用程序正在執行下一個操作:
服務器啓動並偵聽特定端口。 許多corelDraw會話手動或編程啓動。每個corel會話(客戶端)連接到發送當前進程ID的服務器。服務器將所有連接保留在listView中,並基於每個連接EndPoint可以更改(發送和接收)消息。 現在我想使用一個特定的進程ID的COM對象。 我想:查找具有進程ID或MainWindowHandle的多個實例的COM對象(Corel.Application)

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對象這樣的oportunity?

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

在此先感謝!

回答

0

從PID獲取對象沒有通用機制,但取決於OLE服務器的實現,您可以使用AccessibleObjectFromWindow。有關定位PowerPoint的類似示例,請參見Launching Office Apps Programmatically

您也可以try using RotView來查看應用程序是否在Running Object Table中註冊。例如,Visual Studio使用!VisualStudio.DTE.14.0:21604的名稱進行註冊,其中14.0是版本,21604是進程ID。

ROTView showing a VisualStudio entry with the process id

+0

Thnks!我已經嘗試了你的第一個建議,但它對於你知道指南的Microsoft COM對象來說效果很好:IID_IDispatch As String =「{00020400-0000-0000-C000-000000000046}」。我無法找到一種方式來確定它的Corel應用程序。對於第二個建議,我無法找到RotView ...也許它會幫助我找到指南... – FaneDuru

相關問題