Можно ли общаться через COM-объект?
Возможно ли для 2 exes общаться через интерфейс COM (ActiveX?)? Может ли COM DLL координировать обмен данными между двумя отдельными процессами?
6 ответов
Если вы хотите общаться между двумя процессами, используйте именованный канал.
(Можно вызывать удаленный COM-объект и обмениваться данными таким образом, но это излишне сложно.)
Ответ на ваш вопрос, очевидно, да.
Продолжение:
- Почему вы хотите поделиться данными? Что вы пытаетесь достичь? Как выглядят данные? Вам нужно распределить сложные структуры и выполнить сложные вызовы RPC, или у вас просто большой кусок данных в памяти, и вы хотите, чтобы на нем присутствовали два человека?
- Почему вы думаете, что 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-объектом, работающим в отдельном процессе (или даже в машине). Хотя было бы полезно, если бы вы подробно остановились на своем сценарии, возможно, есть лучший вариант того, что вы пытаетесь сделать.