У меня есть два приложения .exe. Каждый из них содержит интерфейсы, совместимые с Automation и описанные в проектах IDL. Итак, у меня есть tlb для обоих приложений. Необходимо организовать методы вызова класса, который реализует один из интерфейсов из кода, выполняемого в другом / другом приложении. Как это работает в COM-сервере и COM-клиенте? Но intrefaces — это конфиденциальность, и она не зарегистрирована в Реестре, поэтому стандартный CoMarshalInterface / CoUnmarshalInterface не работает.
Как я могу это сделать, вручную организовать маршалинг (все необходимые данные существуют: tlb, интерфейсы, совместимые с автоматизацией)?
Постскриптум Похоже этот но без регистрации реестра.
Имея библиотеку типов, доступную и зарегистрированную, вы можете ожидать, что COM автоматически создаст пары прокси / заглушки с использованием информации библиотеки типов. Это, однако, не единственный способ, COM сначала запросит объект, если он способен маршалировать себя в поток через IMarshal
интерфейс, IMarshal::MarshalInterface
метод.
Маршалинг Подробности на MSDN пишет:
Пользовательский маршалинг по своей сути уникален для объекта, который реализует
Это. Он использует прокси, реализованные объектом и предоставленные
Система по запросу во время выполнения. Объекты, которые реализуют пользовательские
маршалинг должен реализовывать интерфейс IMarshal, тогда как объекты, которые
Поддерживать стандарт маршалинга не надо.
Реализуя пользовательский маршалинг таким образом, ваш COM-объект сохраняет свою важную информацию в поток, и он обеспечивает CLSID
unmarshaler для воссоздания интерфейса на другой стороне. Данные будут переданы через границу процесса, и ваш объект будет создан и предоставлен этот поток данных, чтобы вы могли воссоздать соответствующий интерфейс.
Следовательно, реализовать IMarshal
и друзья, и вы сможете интегрировать в обработку COM без регистрации вашей библиотеки типов или даже доступны.
Для взаимодействия двух процессов, содержащих COM-объекты, вы можете использовать ROT (таблицу объектов), вот образец показывая, как это сделать.