Скачиваний:
102
Добавлен:
01.05.2014
Размер:
1.56 Mб
Скачать

IMarshall, маршалинг и взаимодействие клиента с внутренними, локальными и удаленными серверами

Маршалинг был реализован в СОМ для решения проблемы экспорта объектов через адресное пространство процесса. Дальнейшее развитие СОМ-технологии, получившее название DCOM (Distributed COM), позволило осуществлять взаимодействие объектов, выполняющихся на различных компьютерах.

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

Маршалинг был реализован в СОМ для решения проблемы экспорта объектов через адресное пространство процесса. Дальнейшее развитие СОМ-технологии, получившее название DCOM (Distributed COM), позволило осуществлять взаимодействие объектов, выполняющихся на различных компьютерах. Как было сказано выше, единственным способом взаимодействия клиента с СОМ-объектом является использование интерфейсов. На этапе выполнения интерфейс характеризуется адресом, указывающим на другой указатель, который, в свою очередь, указывает на таблицу, содержащую адреса реализации каждой функции, экспортируемой интерфейсом.

Эта структура позволяет обеспечить маршалинг (marshalling) - пересылку указателя между процессами (и в общем случае между компьютерами, иногда называется "маршрутизация").

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

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

Как было рассказано ранее, местоположение сервера определяется на основании записи в реестре. Затем сервер загружается в оперативную память (если он еще не загружен или если требуется новый экземпляр сервера), создает нужный объект и возвращает клиенту указатель на интерфейс.

Если СОМ-сервер является внутренним, то есть выполненным в виде библиотеки DLL, она загружается в адресное пространство клиента с помощью функции Win32 API LoadLibrary. В этом случае значение указателя на интерфейс непосредственно доступно клиенту.

Если сервер локальный, СОМ использует функцию CreateProcess, загружая исполняемый файл и инициализируя СОМ в адресном пространстве последнего. В этом случае обычно нет возможности передать клиенту значение указателя на интерфейс, так как это указатель на объект в другом адресном пространстве. В этом случае в адресных пространствах клиента и сервера создаются два объекта: stub (заглушка) - представитель клиента в адресном пространстве сервера, имеющий дело с реальным указателем на интерфейс, и proxy (заместитель) - представитель сервера в адресном пространстве клиента. Эти два объекта соединяются между собой с целью передачи клиентскому процессу указателя на интерфейс. В этом случае используется маршалинг, создающий так называемый marshalling packet - пакет данных, содержащий необходимую информацию для соединения с процессом, в котором создан объект. Этот пакет создается с помощью функции COM API CoMarshallInterface, затем он передается процессу клиента любым доступным способом, где другая функция CoUnMarshallInterface превращает этот пакет в указатель на интерфейс. Стандартный маршалинг осуществляется с помощью интерфейса IMarshall . Методы CoMarshallInterface и CoUnMarshallInterface вызываются соответственно в реализациях методов интерфейса IMarshall MarshallInterface и UnMarshallInterface.

Сходная технология используется при осуществлении вызовов удаленных процедур (RFC - Remote Procedure Calls), откуда она и была заимствована Microsoft.

Естественно, proxy-объект не содержит реализации методов интерфейса. Все аргументы вызываемых методов помещаются в пакет, передаваемый stub-объекту с использованием RPC. Stub-объект распаковывает переданные аргументы, помещает их в стек и обращается к реальному объекту, используя существующий указатель на интерфейс. Результат выполнения метода упаковывается в пакет и посылается proxy-объекту, который распакот вывает его и передает клиенту.

В случае сервера, расположенного на удаленном компьютере, при обращение к серверу СОМ соединяется со специальным резидентным процессом удаленного компьютера, контролирующим удаленный запуск сервисов на нем (наличие такого процесса диктуется обычными соображениями безопасности). Этот процесс, называемый иногда Service Control Manager (SCM), осуществляет запуск сервера на удаленном компьютере и возвращав ет указатель на интерфейс клиентскому компьютеру и клиентскому процессу. В остальном маршалинг осуществляется точно так же, как и в случае локального сервера, за исключением того, что proxy-объект и stub-объект общаясь с помощью того же самого механизма RPC, физически находятся на разных компьютерах.