數據通知

從外部來源取用數據的物件有時需要在該來源中的數據變更時通知。 例如,依賴某些電子錶格中數據的股票刻度磁帶查看器必須在數據變更時收到通知,才能更新其顯示。 同樣地,複合檔需要其內嵌物件中的數據變更相關信息,以便更新其數據快取。 在這種情況下,如果想要動態更新數據,數據源需要一些機制來通知數據取用者發生變更,而不需要讓取用者卸除所有專案,才能更新其數據。 在理想情況下,在數據源中收到變更的通知后,取用物件可以在其閒暇時要求更新的複本。

COM 處理此類型異步通知的機制是稱為建議接收的物件,這隻是實作稱為 IAdviseSink之介面的任何 COM 物件。 資料的取用者會實作 IAdviseSink。 他們會藉由將指標交給感興趣的數據對象來註冊以接收通知。

IAdviseSink 介面會公開下列方法來接收異步通知:

方法 通知建議接收
OnDataChange
呼叫對象的數據已變更。
OnViewChange
繪製呼叫物件的指示已變更。
OnRename
呼叫物件的Moniker已變更。
OnSave
呼叫物件已儲存至永續性記憶體。
OnClose
呼叫物件已經關閉。

如表格所示,IAdviseSink 介面會公開方法,以通知呼叫對象數據變更以外的事件通知接收建議。 呼叫物件也可以在繪製本身的方式變更或重新命名、儲存或關閉時,通知接收。 雖然通知機制相同,但其他通知主要或完全用於複合文件的內容中。 如需複合檔通知的詳細資訊,請參閱。

若要利用建議接收,數據源必須實作 IDataObject::D Advise、IDataObject::D Unadvise,以及 IDataObject::EnumDAdvise。 數據取用者會呼叫 DAdvise 方法,以通知數據物件,表示它想要在對象的數據變更時收到通知。 取用物件會呼叫 DUnadvise 方法來卸除此連線。 任何感興趣的物件都可以呼叫 EnumDAdvise 方法來瞭解與數據對象有諮詢連線的物件數目。

當來源的數據變更時,數據對象會針對已註冊接收通知的所有數據取用者呼叫 IAdviseSink::OnDataChange。 為了追蹤諮詢連線及管理通知的分派,數據源依賴稱為 數據建議持有者的物件,。 您可以實作 IDataAdviseHolder 介面,以建立自己的數據建議持有者。 或者,您可以呼叫 Helper 函式 CreateDataAdviseHolder,讓 COM 為您執行此動作。

數據傳輸