通知のサポート
プロバイダーとコンシューマーでのコネクション ポイント インターフェイスの実装
通知を実装するために、プロバイダー クラスは IRowsetNotifyCP と IConnectionPointContainer から継承する必要があります。
IRowsetNotifyCP
は、コネクション ポイント インターフェイス IRowsetNotify のプロバイダー サイトを実装します。 IRowsetNotifyCP
は、行セットの内容に対する変更のコネクション ポイント IID_IRowsetNotify
をリスナーに通知するブロードキャスト関数を実装します。
IRowsetNotifyImpl を使用して、コンシューマー (シンクとも呼ばれます) に IRowsetNotify
を実装して登録し、コンシューマーが通知を処理できるようにする必要もあります。 コンシューマーでコネクション ポイント インターフェイスを実装する方法については、「通知の受信」を参照してください。
また、次に示すように、このクラスにはコネクション ポイントのエントリを定義するマップが必要です。
BEGIN_CONNECTION_POINT_MAP
CONNECTIONPOINT_ENTRY (IID_IRowsetNotify)
END_CONNECTION_POINT_MAP
IRowsetNotify の追加
IRowsetNotify
を追加するには、IConnectionPointContainerImpl<rowset-name>
と IRowsetNotifyCP<rowset-name>
を継承チェーンに追加する必要があります。
たとえば、UpdatePV では、RUpdateRowset
の継承チェーンは次のようになります。
Note
サンプル コードは、ここに記載されているものと異なる場合があります。サンプル コードの方を最新バージョンと見なしてください。
///////////////////////////////////////////////////////////////////////////
// class RUpdateRowset (in rowset.h)
class RUpdateRowset :
public CRowsetImpl< RUpdateRowset, CAgentMan, CUpdateCommand,
CAtlArray< CAgentMan, CAtlArray<CAgentMan>>, CSimpleRow,
IRowsetScrollImpl< RUpdateRowset, IRowsetScroll >>,
public IRowsetUpdateImpl< RUpdateRowset, CAgentMan >,
public IConnectionPointContainerImpl<RUpdateRowset>,
public IRowsetNotifyCP<RUpdateRowset>
COM マップのエントリの設定
行セット内の COM マップに次のコードを追加する必要もあります。
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
これらのマクロを使用すると、コネクション ポイント コンテナー (IRowsetNotify
のベース) に対して QueryInterface
を呼び出すユーザーは、要求されたインターフェイスをプロバイダーで検索できます。 コネクション ポイントの使用例については、ATL POLYGON サンプルとチュートリアルを参照してください。
コネクション ポイント マップのエントリの設定
コネクション ポイント マップを追加する必要もあります。 その内容は次のようなものとなります。
BEGIN_CONNECTION_POINT_MAP(rowset-name)
CONNECTION_POINT_ENTRY(_uuidof(IRowsetNotify))
END_CONNECTION_POINT_MAP()
このコネクション ポイント マップを使用すると、IRowsetNotify
インターフェイスを検索するコンポーネントが、プロバイダーでそのインターフェイスを検索できます。
プロパティの設定
また、次のプロパティをプロバイダーに追加する必要もあります。 必要なのは、サポートするインターフェイスに基づいてプロパティを追加することだけです。
プロパティ | サポートする場合に追加 |
---|---|
DBPROP_IConnectionPointContainer | 常時 |
DBPROP_NOTIFICATIONGRANULARITY | 常時 |
DBPROP_NOTIFICATIONPHASES | 常時 |
DBPROP_NOTIFYCOLUMNSET | IRowsetChange |
DBPROP_NOTIFYROWDELETE | IRowsetChange |
DBPROP_NOTIFYROWINSERT | IRowsetChange |
DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE | 常時 |
DBPROP_NOTIFYROWFIRSTCHANGE | IRowsetUpdate |
DBPROP_NOTIFYROWSETRELEASE | 常時 |
DBPROP_NOTIFYROWUNDOCHANGE | IRowsetUpdate |
DBPROP_NOTIFYROWUNDODELETE | IRowsetUpdate |
DBPROP_NOTIFYROWUNDOINSERT | IRowsetUpdate |
DBPROP_NOTIFYROWUPDATE | IRowsetUpdate |
通知の実装の大部分は、既に OLE DB プロバイダー テンプレートに埋め込まれています。 IRowsetNotifyCP
を継承チェーンに追加しない場合、コンパイラはそのコードをすべてコンパイル ストリームから削除するため、コードのサイズが小さくなります。