Úprava dědičnosti třídy RMyProviderRowset
Chcete-li přidat rozhraní IRowsetLocate k příkladu jednoduchého zprostředkovatele pouze pro čtení, změňte dědičnost RMyProviderRowset.Původně RMyProviderRowset dědí z CRowsetImpl.Je nutné to změnit, aby dědil z CRowsetBaseImpl.
Chcete-li to provést, vytvořte novou třídu CMyRowsetImpl v MyProviderRS.h:
////////////////////////////////////////////////////////////////////////
// MyProviderRS.h
template <class T, class Storage, class CreatorClass, class ArrayType = CAtlArray<Storage> >
class CMyRowsetImpl:
public CRowsetImpl<T, Storage, CreatorClass, ArrayType, CSimpleRow, IRowsetLocateImpl< T, IRowsetLocate > >
{
...
};
Nyní upravte mapu rozhraní modelu COM v MyProviderRS.h takto:
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
Tím se vytvoří mapa rozhraní modelu COM, která informuje CMyRowsetImpl, aby volal QueryInterface pro obě rozhraní IRowset a IRowsetLocate.Chcete-li získat všechny implementace ostatních tříd sady řádků, mapa odkazuje třídu CMyRowsetImpl zpět na třídu CRowsetBaseImpl, která je definovaná pomocí šablon technologie OLE DB; mapa používá makro COM_INTERFACE_ENTRY_CHAIN, které sděluje šablonám technologie OLE DB, aby prohledali mapu modelu COM v CRowsetBaseImpl jako odpověď na volání QueryInterface.
Nakonec propojí RAgentRowset na CMyRowsetBaseImpl tím, že změní RAgentRowset, aby dědil z CMyRowsetImpl takto:
class RAgentRowset : public CMyRowsetImpl<RAgentRowset, CAgentMan, CMyProviderCommand>
RAgentRowset nyní může používat rozhraní IRowsetLocate při využití výhod zbytku implementací pro třídu sady řádků.
Když toto uděláte, můžete dynamicky určovat sloupce, které jsou vráceny příjemci.