Можно ли общаться через COM-объект?

Возможно ли для 2 exes общаться через интерфейс COM (ActiveX?)? Может ли COM DLL координировать обмен данными между двумя отдельными процессами?

6 ответов

Если вы хотите общаться между двумя процессами, используйте именованный канал.

(Можно вызывать удаленный COM-объект и обмениваться данными таким образом, но это излишне сложно.)

Ответ на ваш вопрос, очевидно, да.

Продолжение:

  1. Почему вы хотите поделиться данными? Что вы пытаетесь достичь? Как выглядят данные? Вам нужно распределить сложные структуры и выполнить сложные вызовы RPC, или у вас просто большой кусок данных в памяти, и вы хотите, чтобы на нем присутствовали два человека?
  2. Почему вы думаете, что COM - лучший способ сделать это? Рассматривали ли вы просто отправку оконных сообщений или использование именованного канала (как предложено @avakar), или использование общей памяти с именованными мьютексами?

Ответы на #1 будет информировать #2.

Но скажем, COM - лучшее решение для вас. Если у вас есть код в процессе A, который хочет что-то сделать в процессе B, вы регистрируете COM-объект в b.exe и затем выполняете процесс A CoCreateInstance() объект. COM запустит b.exe, создаст объект, указанный в CLSID, который вы передадите в CoCreateInstance (), а затем предоставит вам poitner для указанного интерфейса, который вы запросили в параметре IID для CoCreateInstance(). Теперь вы можете вызывать методы для объекта в процессе B из процесса A.

Если у вас есть дополнительные вопросы или разъяснения, не стесняйтесь продолжать.

COM соберет для вас основные типы данных (в основном все, что поддерживает VARIANT).

Да, 2 exes могут общаться через интерфейс COM.

COM-клиент и COM-сервер могут находиться в одном процессе, в двух отдельных процессах на одном компьютере или на двух разных компьютерах.

Может ли комплекс координировать обмен данными между двумя отдельными процессами?

Внимание: будет два экземпляра этой DLL, по одному в каждом процессе. Если DLL имеет / управляет данными, каждый экземпляр DLL будет иметь свои собственные данные: эти данные не будут разделены между процессами.

Для двух ex-файлов возможно взаимодействие через интерфейс com, где интерфейс COM поддерживает такие методы, как, я не знаю, putData а также getData Однако я думаю, что вы можете собрать / упаковать / установить этот COM-объект как внепроцессный (*.exe) COM-объект, а не как внутрипроцессный (*.dll) COM-объект.

Или, если вы используете библиотеки DLL, вам придется реализовать их, чтобы справиться с двумя отдельными их экземплярами: например, он должен использовать межпроцессные мьютексы вместо критической секции в процессе и межпроцессную общую память вместо -обработка приватной кучи памяти.

Возможно, это не лучший способ координировать обмен данными, но это может быть и способ.

Вы можете взглянуть на " Общий доступ к CoffeeMonitor" для простого примера, написанного на VB6. Это, вероятно, наиболее полезно для n-way коммуникаций, а не для простых сценариев один на один.

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

DCOM (Distributed COM) - это технология для связи с COM-объектом, работающим в отдельном процессе (или даже в машине). Хотя было бы полезно, если бы вы подробно остановились на своем сценарии, возможно, есть лучший вариант того, что вы пытаетесь сделать.

Другие вопросы по тегам