2017-01-24 11 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.Application 객체를 사용하는 oportunity을주는 코렐 COM 개체를 얻을 수있는 방법이 있나요?

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

미리 감사드립니다.

답변

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

+0

Thnks! 이미 첫 번째 제안을 시도했지만 안내서를 알고있는 Microsoft COM 개체의 경우 잘 작동합니다. IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}". 나는 corel 응용 프로그램을 위해 그것을 결정하는 방법을 찾을 수 없습니다. 두 번째 제안에 대해서는 RotView를 찾지 못했습니다 ... 아마 가이드를 찾기 위해 도움이 될 것입니다 ... – FaneDuru