プロバイダーとコンシューマーでのコネクション ポイント インターフェイスの実装
通知を実装するために、プロバイダー クラスは 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 を継承チェーンに追加しない場合、コンパイラはそのコードをすべてコンパイル ストリームから削除するため、コードのサイズが小さくなります。