Упрощенный обработчик на стороне клиента
Упрощенные обработчики на стороне клиента позволяют создавать общие клиентские обработчики любого размера, чтобы помочь вам выполнить любую стандартную задачу. Как обработчики, они доступны для использования несколькими клиентами. Они отличаются от обработчиков OLE в том, что они не могут быть созданы до запуска сервера, и их время существования привязано к диспетчеру прокси-сервера, предотвращая возможное состояние гонки, в котором обработчик может быть преждевременно освобожден.
Прокси-диспетчер — это созданный системой объект, реализующий интерфейс IMarshal . При использовании стандартного маршалинга система создает ее для вас при вызове CoGetStandardMarshal (или CoGetStdMarshalEx для создания агрегатного маршалера для упрощенных обработчиков), а также реализует интерфейсы IClientSecurity и IMultiQI в объекте. На стороне сервера есть соответствующий системный объект, который также реализует IMarshal. Эти объекты обрабатывают маршалинг для вас прозрачно.
Существует два общих типа этих обработчиков, которые могут потребоваться реализовать:
- Обработчик, выполняющий службу, требующую дополнительных данных с сервера
- Обработчик, использующий дополнительные данные с сервера
Ниже приведены некоторые потенциальные возможности использования дополнительных данных в потоке, предоставленном сервером:
- Статические данные с сервера. Независимо от маршалированного интерфейса сервер записывает те же данные в поток.
- Данные по интерфейсу с сервера. В зависимости от того, какой конкретный интерфейс маршалируется, сервер может записывать различные данные в поток.
- Вспомогательные средства для каждого интерфейса. Компоненты COM интерфейса, агрегированные в обработчик клиента и делегирующиеся на стандартный прокси-сервер. Например, чтобы повысить производительность сети, com-компонент для IStream может выполнять кэширование данных на стороне клиента, чтения, записи за пределами, блокировки операций и т. д.
- Сетевая версия интерфейса. Сетевая версия интерфейса отличается от интерфейса, предоставляемого клиентским и серверным кодом приложения. Например, можно использовать мультиплексированные интерфейсы IA и IB через тот же сетевой интерфейс INetAB, как выполняется обработчик сервера внедрения. Например, можно преобразовать интерфейс передачи данных в сетевой интерфейс, использующий каналы для эффективной передачи данных.
Клиенты нижнего уровня могут не иметь возможности размарширования интерфейсов с пользовательскими обработчиками по двум причинам: во-первых, они могут не понимать CLSID, используемый в пользовательском маршалированном пакете, когда обработчик сервера агрегируется, и объект хочет обработчика. Во-вторых, код обработчика может даже не выполняться на стороне клиента, если требуется новая функциональность из COM для создания агрегатного стандартного маршалера и выполнения удаленных вызовов QueryInterface .
См. также