通知のサポート
更新 : 2007 年 11 月
プロバイダとコンシューマでのコネクション ポイント インターフェイスの実装
通知を実装するには、プロバイダ クラスが 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 のコンパイラ機能により、コンパイルのストリームからそのコードがすべて削除されるため、コード サイズが小さくなります。