Modificando a herança de RMyProviderRowset
Para adicionar a interface de IRowsetLocate somente leitura ao exemplo simples do provedor, modifique a herança de RMyProviderRowset. Inicialmente, RMyProviderRowset herda de CRowsetImpl. Você precisa modificá-la para herdar de CRowsetBaseImpl.
Para fazer 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 da interface COM em MyProviderRS.h para ser:
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
Isso cria um mapa da interface COM que indica CMyRowsetImpl para chamar QueryInterface para as interfaces de IRowset e de IRowsetLocate . Para obter qualquer implementação para as outras classes de conjunto de linhas, o mapa vincula a classe de CMyRowsetImpl de volta à classe de CRowsetBaseImpl definida pelos modelos OLE DB; o mapa usa a macro de COM_INTERFACE_ENTRY_CHAIN, com modelos OLE DB para examinar o mapa COM em CRowsetBaseImpl em resposta a uma chamada de QueryInterface .
Finalmente, link RAgentRowset a CMyRowsetBaseImpl alterando RAgentRowset para herdar de CMyRowsetImpl, como segue:
class RAgentRowset : public CMyRowsetImpl<RAgentRowset, CAgentMan, CMyProviderCommand>
RAgentRowset pode usar a interface de IRowsetLocate para tirar proveito do restante da implementação da classe do conjunto de linhas.
Quando isso for feito, você pode determinar dinamicamente as colunas retornadas ao consumidor.