外部ソースのデータを使用するオブジェクトは、そのソース内のデータが変更されたときに通知を受け取る必要がある場合があります。 たとえば、一部のスプレッドシート内のデータに依存するストック ティッカー テープ ビューアーは、そのデータが変更されたときに通知を受け取り、表示を更新できるようにする必要があります。 同様に、複合ドキュメントでは、データ キャッシュを更新できるように、埋め込みオブジェクトのデータ変更に関する情報が必要です。 このような場合、データの動的な更新が望ましい場合、データソースでは、データを更新するためにコンシューマーにすべてを削除する義務を負うことなく、データコンシューマーに変更を通知するメカニズムが必要です。 データ ソースで変更が発生したことが通知された場合、使用するオブジェクトは、必要に応じて更新されたコピーを要求できるのが理想的です。
この型の非同期通知を処理するための COM のメカニズムは、アドバイズ シンクと呼ばれるオブジェクトです。これは、IAdviseSinkというインターフェイスを実装するすべての COM オブジェクトです。 データのコンシューマーは、IAdviseSinkを実装します。 関心のあるデータ オブジェクトへのポインターを渡すことによって、通知を受け取るために登録します。
IAdviseSink インターフェイスは、非同期通知を受信するための次のメソッドを公開します。
| 方式 | をアドバイズ シンクに通知します。 |
|---|---|
| OnDataChangeをする |
呼び出し元オブジェクトのデータが変更されました。 |
| OnViewChangeの |
呼び出し元オブジェクトを描画する手順が変更されました。 |
| OnRenameをする |
呼び出し元オブジェクトのモニカーが変更されました。 |
|
OnSave |
呼び出し元のオブジェクトは永続ストレージに保存されています。 |
|
OnClose |
呼び出し元のオブジェクトが閉じられました。 |
テーブルが示すように、IAdviseSink インターフェイスは、呼び出し元オブジェクトのデータの変更以外のイベントのアドバイズ シンクに通知するためのメソッドを公開します。 呼び出し元のオブジェクトは、シンク自体の描画方法が変更されたとき、または名前の変更、保存、または閉じられたときにシンクに通知することもできます。 これらの他の通知は、主に、または完全に複合ドキュメントのコンテキストで使用されますが、通知メカニズムは同じです。 複合ドキュメント通知の詳細については、「複合ドキュメント」を参照してください。
アドバイズ シンクを利用するには、データ ソースで IDataObject::D Advise 、IDataObject::D Unadvise、および IDataObject::EnumDAdviseを実装する必要があります。 データ コンシューマーは 、DAdvise メソッドを呼び出して、オブジェクトのデータが変更されたときに通知されることをデータ オブジェクトに通知します。 使用しているオブジェクトは、DUnadvise メソッドを呼び出して、この接続を破棄します。 関心のあるユーザーは、EnumDAdvise メソッドを呼び出して、データ オブジェクトとのアドバイザリ接続を持つオブジェクトの数を学習できます。
ソースでデータが変更されると、データ オブジェクトは、通知を受け取るために登録されているすべてのデータ コンシューマーに IAdviseSink::OnDataChange を呼び出します。 アドバイザリ接続を追跡し、通知のディスパッチを管理するために、データ ソースは、データ アドバイザリング ホルダーと呼ばれるオブジェクトに依存します。 IDataAdviseHolder インターフェイスを実装することで、独自のデータ アドバイズ ホルダーを作成できます。 または、CreateDataAdviseHolderヘルパー関数を呼び出すことによって、COM にこれを許可することもできます。