Доступ к COM-объекту через дескриптор процесса Windows - PullRequest
2 голосов
/ 30 апреля 2010

В настоящее время я автоматизирую приложение на работе с помощью COM, и у меня возникла проблема, когда у любого, кто использует мое приложение, возникает проблема, если исходное приложение уже открыто при запуске моего приложения. Я знаю, как найти процесс, если он открыт, но вместо того, чтобы беспокоиться о его закрытии, или обойти его и т. Д., Я хочу попробовать использовать существующее приложение вместо открытия нового.

Вот как я обычно запускаю приложение в моей программе автоматизации:

Designer.Application desApp = new Designer.Application();

Теперь я пытаюсь использовать дескриптор из существующего приложения:

Designer.Application desApp = (Designer.Application)((System.Diagnostics.Process.GetProcessesByName("Designer.exe")[0]).Handle)

(я знаю, что это не работает, поскольку .Handle возвращает IntPtr, но я использую его в качестве примера.)

Есть ли способ сделать это? Как вернуть работающий объект, если я знаю дескриптор / процесс?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

COM-способ присоединения к существующему объекту автоматизации для извлечения объекта для таблицы работающих объектов (ROT) http://msdn.microsoft.com/en-us/library/ms695276(VS.85).aspx.

Вы можете использовать интерфейс IRunningObjectTable для регистрации ваших COM-объектов в ROT. http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comtypes.irunningobjecttable.aspx

И используйте для запроса ROT о существующем экземпляре вашего объекта. System.Runtime.InteropServices.Marshal.GetActiveObject, например.

2 голосов
/ 30 апреля 2010

Вы не можете сделать эту работу в коде клиента, это должно быть обработано на сервере. Сервер должен вызвать CoRegisterClassObject () с передачей REGCLS_MULTIPLEUSE, чтобы нескольким клиентам было разрешено использовать один экземпляр сервера. Нет другого механизма, позволяющего клиенту получить указатель интерфейса на объект Application.

Это очень задумано, сервер должен быть спроектирован и написан для поддержки такого использования. Его нельзя прикрутить позже.

...