2017-01-24 21 views
0

У меня есть приложение Client Server, которое делает следующее:
Сервер запускает и прослушивает определенный порт. Многие операции corelDraw вручную или программно запускаются. Каждый сеанс corel (клиент) подключается к серверу, отправляя текущий идентификатор процесса. Сервер поддерживает все подключения в listView и на основе каждого соединения EndPoint может изменять (отправлять и получать) сообщения. Теперь я хотел бы использовать COM-объект определенного идентификатора процесса. Я пробовал:Найти COM-объект (Corel.Application) для нескольких экземпляров с идентификатором процесса или MainWindowHandle

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, чтобы дать мне Oportunity использовать объект Corel.Application, как это?

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

Заранее благодарен!

ответ

0

Не существует механизма общего назначения для получения объекта из PID, но в зависимости от реализации OLE-сервера вы можете использовать AccessibleObjectFromWindow. См. Launching Office Apps Programmatically для аналогичного примера, ориентированного на PowerPoint.

Вы также можете позвонить try using RotView, если приложение зарегистрировано в таблице «Запуск объекта». Например, Visual Studio регистрирует код с номером !VisualStudio.DTE.14.0:21604, где 14.0 - это версия, а 21604 - идентификатор процесса.

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