檢視快取
容器應用程式必須能夠取得物件的呈現,以在檔案開啟時為用戶顯示或列印物件,但對象的伺服器應用程式未執行或未安裝在使用者的電腦上。 不過,假設檔中可能可能找到之所有對象的伺服器都會安裝在每個用戶的計算機上,而且永遠可以視需要執行是不切實際的。 默認物件處理程式隨時可供使用,藉由快取檔儲存區中的對象簡報,並在任何平臺上操作這些簡報,而不論物件伺服器在任何特定安裝容器上是否可用,來解決此問題。
除了維護螢幕上物件所需的簡報之外,容器還可以維護一或多個特定目標裝置的繪圖簡報。 此外,如果您將物件從某個平臺移植到另一個平臺,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。
相關主題