RCustomRowset の継承の変更
単純な読み取り専用プロバイダーの例に IRowsetLocate
インターフェイスを追加するには、CCustomRowset
の継承を変更します。 最初、CCustomRowset
は CRowsetImpl
を継承します。 CRowsetBaseImpl
を継承するように変更する必要があります。
これを行うには、新しいクラス CCustomRowsetImpl
を CustomRS.h に作成します。
////////////////////////////////////////////////////////////////////////
// CustomRS.h
template <class T, class Storage, class CreatorClass, class ArrayType = CAtlArray<Storage>>
class CMyRowsetImpl:
public CRowsetImpl<T, Storage, CreatorClass, ArrayType, CSimpleRow, IRowsetLocateImpl< T, IRowsetLocate >>
{
...
};
ここで、CustomRS.h の COM インターフェイス マップを次のように編集します。
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
このコードによって、IRowset
および IRowsetLocate
インターフェイス両方について QueryInterface
を呼び出すように CMyRowsetImpl
に指示する COM インターフェイス マップが作成されます。 他の行セット クラスの実装をすべて取得するために、マップによって、CMyRowsetImpl
クラスが OLE DB テンプレートで定義されている CRowsetBaseImpl
クラスにリンクされます。このマップは COM_INTERFACE_ENTRY_CHAIN マクロを使用しますが、このマクロが、QueryInterface
呼び出しに応答して CRowsetBaseImpl
の COM マップを使用するように OLE DB テンプレートに指示します。
最後に、CCustomRowset
が CMyRowsetImpl
を継承するように変更することで、CCustomRowset
を CMyRowsetBaseImpl
にリンクします。
class CCustomRowset : public CMyRowsetImpl<CCustomRowset, CCustomWindowsFile, CCustomCommand>
これで、CCustomRowset
が IRowsetLocate
インターフェイスを使用すると同時に、行セット クラスのその他の実装も利用できるようになりました。
これが完了したら、コンシューマーに返される列を動的に決めることができます。