Modificando a herança de RMyProviderRowset
Para adicionar o IRowsetLocate interface para o exemplo de provedor de somente leitura simples, modificar a herança de RMyProviderRowset.Inicialmente, RMyProviderRowset herda de CRowsetImpl.Você precisa modificá-la para herdar de CRowsetBaseImpl.
Para isso, crie uma nova classe, CMyRowsetImpl, em 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 > >
{
...
};
Agora, edite o mapa de interface COM em MyProviderRS.h ser como segue:
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
Isso cria um mapa de interface COM informa CMyRowsetImpl para chamar QueryInterface para ambos os IRowset e IRowsetLocate interfaces.Para obter toda a implementação de outro conjunto de linhas classes, os links do mapa de CMyRowsetImpl classe de volta para o CRowsetBaseImpl classe definido pelo OLE DB modelos; o mapa usa a macro COM_INTERFACE_ENTRY_CHAIN, que diz modelos OLE DB para examinar o mapa de COM em CRowsetBaseImpl em resposta a uma QueryInterface de chamada.
Finalmente, o link RAgentRowset para CMyRowsetBaseImpl modificando RAgentRowset para herdar de CMyRowsetImpl, da seguinte forma:
class RAgentRowset : public CMyRowsetImpl<RAgentRowset, CAgentMan, CMyProviderCommand>
RAgentRowsetagora pode usar o IRowsetLocate interface, aproveitando o restante da implementação para a classe de conjunto de linhas.
Quando isso for feito, você pode dinamicamente determinar colunas retornadas para o consumidor.