Сущность технологии COM




Специальный маршалинг - часть 2


// revoke a marshal (CoReleaseMarshalData) // аннулируем маршалер (CoReleaseMarshalData) HRESULT ReleaseMarshalData([in] IStream *pStm);

// tear down connection-state (CoDisconnectObject) // разрываем связь между объектами (CoDisconnectObject) HRESULT DisconnectObject([in] DWORD dwReserved); }

Комментарии, предваряющие определения методов, показывают, какие именно API-функции вызывает каждый из них.

Когда метод CoMarshalInterface вызывается на объект, поддерживающий специальный маршалинг, маршалированная объектная ссылка имеет несколько другой (формат, как показано на рис. 5.7. Заметим, что после стандартного заголовка MEOW маршалированная объектная ссылка просто содержит CLSID, используемый для создания специального заместителя и непрозрачного байтового массива, предназначенного для инициализации этого специального заместителя. CoMarshalInterface находит CLSID специального заместителя посредством вызова на объект метода IMarshal::GetUnmarshalСlass. CoMarshalInterface заполняет непрозрачный байтовый массив, вызывая реализацию метода IMarshal::MarshalInterface объекта. Именно в MarshalInterface объект получает свой первый и единственный шанс послать инициализационное сообщение новому специальному заместителю, просто записав его в подаваемый байтовый поток.

Рис. 5.7. Объектная ссылка специального маршалинга

При вызове CoUnmarshalInterface это сообщение будет передано вновь созданному специальному заместителю через его метод IMarshal::UnmarshalInterface. Это означает, что и объект, и специальный заместитель должны реализовать IMarshal. Метод объекта MarshalInterface записывает инициализационное сообщение. Метод заместителя UnmarshalInterface читает инициализационное сообщение. Когда метод UnmarshalInterface возвращается, СОМ больше не участвует ни в каких связях заместитель/объект. Реализация интерфейсных методов семантически корректным способом является делом специального заместителя. Если нужно произвести удаленный вызов метода на объект, то сделать это — задача заместителя.


Содержание  Назад  Вперед