通知のサポート
プロバイダーとコンシューマーでのコネクション ポイント インターフェイスの実装
通知を実装するには、プロバイダー クラスが 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 の継承チェインの例を次に示します。
[!メモ]
サンプル コードは、ここに記載されているコードと異なる場合がありますが、その場合はサンプル コードの方が最新バージョンであると考えてください。
///////////////////////////////////////////////////////////////////////////
// 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 を継承チェーンに追加しない場合は、Visual C++ .NET のコンパイラ機能により、コンパイルのストリームからそのコードがすべて削除されるため、コード サイズが小さくなります。