Поделиться через


Облегченный обработчик Client-Side

Упрощенные обработчики на стороне клиента позволяют создавать общие клиентские обработчики любого размера, чтобы помочь вам выполнить любую стандартную задачу. Как обработчики, они доступны для использования несколькими клиентами. Они отличаются от обработчиков OLE тем, что не могут быть созданы до запуска сервера, и их время существования привязано к менеджеру прокси, предотвращая потенциальное состояние соревнования, при котором обработчик может быть преждевременно освобожден.

Прокси-диспетчер — это созданный системой объект, реализующий интерфейс IMarshal. При использовании стандартного маршалинга система создает его для вас при вызове CoGetStandardMarshal (или CoGetStdMarshalExдля создания агрегатного маршалера для упрощенных обработчиков), а также реализует интерфейсы IClientSecurity и IMultiQI на объекте. На стороне сервера есть соответствующий системный объект, который также реализует IMarshal. Эти объекты выполняют маршалинг данных для вас незаметно.

Существует два основных типа этих обработчиков, которые вы можете захотеть реализовать.

  • Обработчик, выполняющий службу, не требующую дополнительных данных с сервера
  • Обработчик, использующий дополнительные данные с сервера

Ниже приведены некоторые потенциальные возможности использования дополнительных данных в потоке, предоставленном сервером:

  • Статические данные с сервера. Независимо от того, какой интерфейс маршалируется, сервер записывает те же данные в поток.
  • Данные по каждому интерфейсу с сервера. В зависимости от того, какой конкретный интерфейс подлежит маршалированию, сервер может вносить различные данные в поток.
  • Вспомогательные средства для каждого интерфейса. COM-компоненты, определенные для каждого интерфейса, собраны в обработчик клиента и делегируют стандартному прокси-серверу. Например, чтобы повысить производительность сети, COM-компонент для IStream может выполнять кэширование данных на стороне клиента, предварительное чтение, отложенную запись, управление блокировками операций и т. д.
  • Сетевая версия интерфейса. Сетевая версия интерфейса отличается от интерфейса, предоставляемого клиентским и серверным кодом приложения. Например, можно мультиплексировать интерфейсы IA и IB через тот же сетевой интерфейс INetAB таким же образом, как это делает обработчик сервера внедрения. Например, можно преобразовать интерфейс передачи данных в сетевой интерфейс, использующий каналы для эффективной передачи данных.

Клиенты нижнего уровня могут не иметь возможности размарширования интерфейсов с пользовательскими обработчиками по двум причинам: во-первых, они могут не понимать CLSID, используемый в пользовательском маршалированном пакете, когда обработчик сервера агрегируется, и объект хочет обработчика. Во-вторых, код обработчика может даже не выполняться на стороне клиента, если для создания совокупного стандартного маршалера и выполнения удаленных вызовов QueryInterface требуется новая функциональность из COM.

Обработчик OLE