Да, это возможно.Основной принцип одинаков независимо от того, разделяете ли вы один экземпляр объекта между квартирами в одном процессе или между отдельными процессами.
Здесь есть два подхода: возможно, самый простой - использовать RunningТаблица объектов : по сути, это таблица именованных COM-объектов для всей рабочей станции.Один процесс добавляет объект в таблицу с хорошо известным именем, а другой процесс ищет этот объект.
Другой подход заключается в использовании маршалинга.Маршалинг - это процесс использования COM API для получения последовательности байтов, которые описывают местоположение объекта.Затем вы можете скопировать эту серию байтов в другой процесс, используя любые средства (разделяемая память, файл, канал и т. Д.), А затем использовать другой COM API в процессе получения, чтобы демонтировать объект;Затем COM создает подходящий удаленный прокси в этом процессе, который связывается с исходным.Посмотрите API CoMarshalIntefcace и CoUnmarshalInterface для получения более подробной информации.
Обратите внимание, что для того и другого необходима соответствующая поддержка удаленного взаимодействия для объекта;используемые вами интерфейсы должны быть описаны в IDL, скомпилированы и зарегистрированы соответствующим образом.
-
К сожалению, у меня нет кода, пригодного для любого из этих случаев.
Для подхода CoMarshalInterface этот процесс выглядит примерно так:
- Используйте CreateStreamOnHGlobal (с NULL hglobal) для создания IStream, поддерживаемого HGLOBAL, который COM выделяет при необходимости
- Используйте CoMarshalInterface для маршалингауказатель интерфейса на поток (который, в свою очередь, записывает его в память, поддерживаемую HGLOBAL)
- Используйте GetHGlobalFromStream, чтобы получить HGLOBAL из потока
- Используйте GlobalLock / GlobalSize, чтобы заблокировать HGLOBAL и получить доступ к размеченным данным (GlobalUnlock, когдаготово)
- Используйте все средства, которые хотите, чтобы скопировать байты в целевой процесс.
На дальней стороне используйте:
- GlobalAlloc / GlobalLock / GlobalUnlock, чтобы создать новый HGLOBAL и заполнить его маршалированными данными
- CreateStreamOnHGlobal с вашим новым HGLOBAL
- Передайте этот поток CoUnmarshalInterface
Обычные правила пересчета / ресурса COM и Windows применяются ко всему этому;AddRef / Release по мере необходимости;используйте GlobalFree для освобождения выделенных вами HGLOBAL и т. д.