Как я могу обратиться к COM-объекту, идентифицированному данным IUnknown*, из другого процесса?

Я написал два небольших приложения на C++, одно из которых представляет собой контейнер ActiveX со встроенным элементом управления ActiveX. Это приложение-контейнер знает IUnknown*, ссылающийся на элемент управления ActiveX.

Другое приложение — это клиент, который должен взаимодействовать с элементом управления ActiveX в первом приложении. Однако я не знаю, как получить дескриптор элемента управления в клиентском приложении. Простой перенос значения указателя IUnknown* с сервера на клиент не будет работать, конечно, из-за независимых адресных пространств.

Можно ли каким-то образом «продублировать» дескриптор какого-либо COM-объекта, чтобы вновь созданный дескриптор мог использоваться другими процессами? Я бы хотел, чтобы COM выполнял RPC за меня. В противном случае мне пришлось бы выполнять все COM-вызовы в серверном приложении и выполнять все RPC самостоятельно. :-/


person Frerich Raabe    schedule 14.04.2011    source источник
comment
Ознакомьтесь с ответом на этот аналогичный вопрос: stackoverflow.com/questions/5425770/   -  person BrendanMcK    schedule 14.04.2011


Ответы (1)


Вы можете взглянуть на RPC в целом и COM Прокси.

Прокси находится в адресном пространстве вызывающего процесса и действует как суррогат удаленного объекта. С точки зрения вызывающего объекта прокси-сервер является объектом. Обычно роль прокси-сервера заключается в упаковке параметров интерфейса для вызовов методов в интерфейсах его объектов. Прокси упаковывает параметры в буфер сообщений и передает этот буфер в канал, который обрабатывает передачу между процессами. Прокси реализован как составной или составной объект. Он содержит предоставляемую системой часть менеджера, называемую прокси-менеджером, и один или несколько специфичных для интерфейса компонентов, называемых интерфейсными прокси. Количество интерфейсных прокси равно количеству объектных интерфейсов, которые были открыты этому конкретному клиенту. Клиенту, соблюдающему объектную модель компонентов, прокси кажется реальным объектом.

person ta.speot.is    schedule 14.04.2011
comment
Это выглядит очень интересно, но мне трудно найти более подходящую документацию. Возможно, вы знаете, как я могу легко создать прокси-объект в вызывающем процессе для некоторого заданного IUnknown* в вызываемом процессе? - person Frerich Raabe; 14.04.2011
comment
msdn.microsoft.com/en-us/library /ms692621(v=vs.85).aspx — в случае большинства COM-интерфейсов прокси-серверы и заглушки для стандартного маршалинга представляют собой внутрипроцессные объекты-компоненты, которые загружаются из общесистемной библиотеки DLL, предоставляемой COM в Ole32. dll. - person ta.speot.is; 14.04.2011
comment
Я могу быть тугим, извините - вы знаете, какой API использовать для а) уникальной идентификации некоторого COM-объекта и б) использования этого уникального идентификатора в другом процессе для создания прокси-объекта, который выполняет RPC? - person Frerich Raabe; 14.04.2011
comment
А, кажется, CoMarshalInterface и CoUnmarshalInterface то, что мне нужно! - person Frerich Raabe; 14.04.2011