Маршалинг

Межпроцессорное взаимодействие

То, что клиент имеет ссылку на бинарный интерфейс равносильно следующему:

1. В первом типе серверов (in-proc) это означает, что клиент имеет указатель, указывающий непосредственно на интерфейс объекта (можно видеть, что вызов будет довольно эффективный по скорости быстродействия компонентов).

2. Во втором типе серверов (local) это означает, что необходим механизм межпроцессорной синхронизации, так как указатель ссылается не на интерфейс объекта, а на его заместитель – proxy, находящийся в процессе клиента.

Заместитель – COM объект, предоставляющий те же самые интерфейсы, что и объект на локальном сервере. Для корректной межпроцессорной синхронизации необходимо:

1. Упаковать параметры для пересылки;

2. Передать запрос и параметры в другой процесс (механизм LPC).

На локальном сервере происходит, во-первых, распаковка параметров, и, во-вторых, вызов метода объекта.

Необходимо отметить то, что данный механизм работает медленнее по сравнению с первым типом серверов из-за процессов упаковки-распаковки (маршалинга, демаршалинга).

3. В третьем типе серверов (remote) это означает то же самое, что и у второго типа, только в качестве среды передачи параметров и запроса выступает уже не локальный компьютер, а среда DCOM.

Как уже упоминалось ранее, для любого типа сервера, для клиента полная прозрачность механизма COM.

Marshaling – это процесс запаковки и посылки вызовов (методов COM-интерфейса) через границу процесса (или потоков одного и того же приложения). COM поддерживает два вида маршалинга: «стандартный маршалинг» и «ручной маршалинг». Первый подразумевает практически автоматическую поддержку со стороны средств разработки. Второй же дает максимальную гибкость и позволяет заменить реализацию процесса маршалинга на собственную.

В процессе маршалинга в другой контекст (возможно, удаленный) передаются данные, которые там распаковываются и преобразуются в вид, пригодный для использования. Указатели на эти данные помещаются в стек, и производится передача управления вызываемому/вызывающему коду. При этом в качестве данных могут быть переданы и указатели на другие интерфейсы (возможно, других объектов). Именно передача (маршалинг) интерфейсов нас и будет интересовать больше всего, так как именно при этом встает вопрос – «Какой тип и подтип маршалинга будет использовать переданный указатель на интерфейс?». «Маршалинг указателя на интерфейс» и «Маршалинг для интерфейса» (или просто маршалинг). Первый подразумевает установление связи между удаленным объектом и вызывающим апартаментом, а второй – комплекс мер по запаковке и посылке вызовов методов COM-интерфейса. Это очень важно! Зачем нужен маршалинг между процессами, понятно. Процессы в Win32 имеют разные адресные пространства, поэтому указатели на данные в другом процессе не имеют смысла даже в пределах одного компьютера, не говоря уже о разных. А зачем нужен маршалинг между потоками одного и того же процесса? Коротко на этот вопрос можно ответить так: для облегчения работы программистов не умеющих, не имеющих возможности (например, VB-программистов) или попросту не желающих писать потокобезопасный код. Если говорить точнее, то это связано с апартаментной моделью, принятой в COM.