Да, это возможно. Базовый принцип один и тот же независимо от того, используете ли вы один экземпляр объекта совместно между подразделениями в одном процессе или между отдельными процессами.
Здесь есть два подхода: возможно, самый простой — использовать Таблица рабочих объектов: это, по сути, таблица именованных COM-объектов для всей рабочей станции. У вас есть один процесс, добавляющий в таблицу объект с хорошо известным именем, а другой процесс ищет этот объект.
Другой подход заключается в использовании маршалинга. Маршалинг — это процесс использования COM API для получения последовательности байтов, описывающих расположение объекта. Затем вы можете скопировать эту серию байтов в другой процесс, используя любые средства, которые вы хотите (общая память, файл, канал и т. д.), а затем использовать другой COM API в принимающем процессе для демаршалирования объекта; Затем COM создает в этом процессе подходящий удаленный прокси-сервер, который обменивается данными с исходным. Ознакомьтесь с API CoMarshalInterface и CoUnmarshalInterface для получения дополнительных сведений.
Обратите внимание, что оба они требуют, чтобы у вас была подходящая поддержка удаленного взаимодействия для объекта; интерфейсы, которые вы используете, должны быть описаны в IDL, скомпилированы и зарегистрированы соответствующим образом.
--
К сожалению, у меня нет кода для любого из этих случаев.
Для подхода CoMarshalInterface процесс выглядит примерно так:
- Use CreateStreamOnHGlobal (with NULL hglobal) to create an IStream that's backed by a HGLOBAL that COM allocates as needed
- Use CoMarshalInterface to marshal the interface pointer to the stream (which in turn writes it to the memory backed by the HGLOBAL)
- Use GetHGlobalFromStream to get the HGLOBAL from the stream
- Use GlobalLock/GlobalSize to lock the HGLOBAL and access the marhaled data (GlobalUnlock when done)
- Use whatever means you want to to copy the bytes to the target process.
На дальней стороне используйте:
- GlobalAlloc/GlobalLock/GlobalUnlock to create a new HGLOBAL and populate it with the marshaled data
- CreateStreamOnHGlobal with your new HGLOBAL
- Pass this stream to CoUnmarshalInterface
Ко всему этому применяются обычные правила подсчета ссылок/ресурсов COM и Windows; AddRef/Release по мере необходимости; используйте GlobalFree, чтобы освободить любые HGLOBAL, которые вы выделяете, и т. д.
person
BrendanMcK
schedule
25.03.2011