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

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

Контейнеры могут поддерживать презентации рисования для одного или нескольких конкретных целевых устройств в дополнение к одному, необходимому для поддержания объекта на экране. Кроме того, при переносе объекта из одной платформы в другую 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 отвечает за получение данных в различных форматах и т. д., между памятью и базовым экземпляром I служба хранилища внедренного объекта. Пользовательские обработчики могут использовать эти реализации, агрегируя на обработчике по умолчанию.

Примечание

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

 

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