Реализация и активация обработчика без дополнительных данных сервера

Чтобы создать экземпляр вашего обработчика, в случае отсутствия получения дополнительных данных сервера, сервер должен реализовать IStdMarshalInfo, но не IMarshal. IStdMarshalInfo имеет один метод, GetClassForHandler, который извлекает CLSID обработчика объектов, который будет использоваться в целевом процессе. COM вызывает это при вызове CoMarshalInterface и активирует обработчик на стороне клиента.

Затем реализация сервера и обработчика должны вызывать функцию CoGetStdMarshalEx. Эта функция создает стандартный маршалер на каждой стороне (называемый прокси-диспетчером на стороне клиента и диспетчером заглушки на стороне сервера).

Сервер вызывает CoGetStdMarshalEx, передавая флаг SMEXF_SERVER. При этом создается стандартный маршалер на стороне сервера (управляющий заглушками). Структура на стороне сервера показана на следующем рисунке:

схема, показывающая структуру на стороне сервера.

Структура Server-Side

Обработчик вызывает CoGetStdMarshalEx, передавая флаг SMEXF_HANDLER. Это создает клиентский стандартный маршалер (прокси-диспетчер) и объединяет его с обработчиком на стороне клиента. Время существования обоих управляются объектом контролирующего идентификатора (реализующим IUnknown), который система реализует, когда обработчик вызывает CoGetStdMarshalEx. Структура на стороне клиента показана на следующем рисунке.

Диаграмма, где показана структура клиентской части.

Структура Client-Side

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

Когда COM вызывает CoUnmarshalInterface для клиента, он создает экземпляр обработчика, объединяя его с идентичностью. Обработчик создаст стандартный маршалер (путем вызова CoGetStdMarshalEx, передавая управляемое неизвестное значение, полученное при создании). Обработчик не реализует IMarshal, но лишь возвращает IMarshal из стандартного маршалера. Даже если обработчиком реализован IMarshal, он не будет вызываться во время декодирования.

Если два потока одновременно размыкают один и тот же объект в первый раз, можно временно создать два обработчика. Затем он будет выпущен.

Легкий обработчик Client-Side