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


Просмотр кэширования

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

Контейнеры могут поддерживать презентации рисования для одного или нескольких конкретных целевых устройств в дополнение к одному, необходимому для поддержания объекта на экране. Кроме того, при переносе объекта из одной платформы в другую OLE автоматически преобразует форматы данных объекта в поддерживаемые на новой платформе. Например, при перемещении объекта из Windows в Macintosh OLE преобразует свои презентации метафайлов в форматы PICT.

Чтобы представить точное представление внедренного объекта пользователю, приложение контейнера объекта инициирует диалоговое окно с обработчиком объектов, запрашивая данные и инструкции по рисованию. Чтобы выполнить запросы контейнера, обработчик должен реализовать интерфейсы IDataObject, IViewObject2 и IOleCache , и .

IDataObject позволяет приложению контейнера OLE получать данные из и отправлять данные в внедренные или связанные объекты. При изменении данных в объекте этот интерфейс позволяет объекту сделать новые данные доступными для своего контейнера и предоставить контейнеру способ обновления данных в копии объекта. (Обсуждение передачи данных в целом см. в главе 4, передача данных.)

Интерфейс IViewObject2 очень похож на интерфейс IDataObject, за исключением того, что он просит объект нарисовать себя в контексте устройства, например экран, принтер или метафайл, а не перемещать или копировать данные в память или другой носитель передачи. Цель интерфейса заключается в том, чтобы контейнер OLE мог получать альтернативные изображения своих внедренных объектов, данные которых уже есть, тем самым избегая необходимости передавать совершенно новые экземпляры одних и тех же объектов данных, чтобы просто получить новые инструкции для рисования. Вместо этого интерфейс IViewObject2позволяет контейнеру запрашивать объект для предоставления графического представления себя путем рисования контекста устройства, заданного контейнером.

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

Интерфейс IViewObject2также предоставляет методы, позволяющие контейнерам регистрировать уведомления об изменении представления. Как и в случае с данными и уведомлениями OLE, подключение к представлению позволяет контейнеру обновлять отрисовку объекта по своему усмотрению, а не в ответ на вызов объекта. Например, если новая версия серверного приложения объекта будет предлагать дополнительные представления одинаковых данных, обработчик по умолчанию объекта вызовет реализацию каждого контейнера IAdviseSink::OnViewChange, чтобы сообщить им, что новые презентации были доступны. Контейнер будет извлекать эти сведения из приемника рекомендаций только при необходимости.

Поскольку контексты устройств Windows имеют значение только в рамках одного процесса, невозможно передать IViewObject2 указатели по границам процесса. В результате локальные и удаленные серверы OLE не нуждаются в реализации интерфейса, который не будет работать должным образом, даже если они это сделают. Только обработчики объектов и внутрипроцессные серверы реализуют интерфейс IViewObject2. OLE предоставляет реализацию по умолчанию, которую можно использовать в собственных серверах обработки OLE и обработчиках объектов, просто агрегируя обработчик OLE по умолчанию. Вы также можете написать собственную реализацию IViewObject2.

Объект реализует интерфейс IOleCache, чтобы сообщить обработчику, какие возможности следует кэшировать. Обработчик объектов также владеет кэшем и гарантирует, что он сохраняется в актуальном состоянии. По мере того как внедренный объект входит в состояние выполнения, обработчик настраивает соответствующие консультативные подключения к объекту сервера, при этом сам он выступает в качестве приемника. Реализации интерфейсов IDataObject и IViewObject2работают с кэшированными данными на стороне клиента. Реализация обработчика IViewObject2отвечает за определение форматов данных, которые нужно кэшировать, чтобы удовлетворить клиентские запросы на отрисовку. Реализация IDataObject обработчика отвечает за получение данных в различных форматах между памятью и основным экземпляром встроенного объекта IStorage. Пользовательские обработчики могут использовать эти реализации, агрегируя на обработчике по умолчанию.

Заметка

Интерфейс IViewObject2 является простым функциональным расширением IViewObject и должен быть реализован вместо последнего интерфейса, который в настоящее время устарел. Помимо предоставления методов IViewObject интерфейс IViewObject 2 предоставляет один дополнительный элемент, GetExtent, что позволяет приложению-контейнеру получить размер презентации объекта из кэша без первого перемещения объекта в состояние выполнения с вызовом IOleObject:: GetExtent.

 

составные документы