Modificar a herança de RCustomRowset
Para adicionar a interface IRowsetLocate
ao exemplo simples de provedor somente leitura, modifique a herança de CCustomRowset
. Inicialmente, CCustomRowset
herda de CRowsetImpl
. Você precisa modificá-lo para herdar de CRowsetBaseImpl
.
Para fazer isso, crie uma nova classe, CCustomRowsetImpl
, no RS.h personalizado:
////////////////////////////////////////////////////////////////////////
// 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 >>
{
...
};
Agora, edite o mapa da interface COM no RS.h personalizado para que fique da seguinte maneira:
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
Esse código cria um mapa de interface COM que informa a CMyRowsetImpl
para chamar QueryInterface
para as interfaces IRowset
e IRowsetLocate
. Para obter toda a implementação das outras classes de conjunto de linhas, o mapa vincula a classe CMyRowsetImpl
de volta à classe CRowsetBaseImpl
definida pelos modelos OLE DB; o mapa usa a macro COM_INTERFACE_ENTRY_CHAIN, que instrui os modelos OLE DB para examinar o mapa COM em CRowsetBaseImpl
em resposta a uma chamada QueryInterface
.
Por fim, vincule CCustomRowset
a CMyRowsetBaseImpl
modificando CCustomRowset
para herdar de CMyRowsetImpl
, da seguinte maneira:
class CCustomRowset : public CMyRowsetImpl<CCustomRowset, CCustomWindowsFile, CCustomCommand>
CCustomRowset
agora pode usar a interface IRowsetLocate
enquanto aproveita o restante da implementação para a classe de conjunto de linhas.
Quando isso estiver concluído, você poderá determinar dinamicamente as colunas retornadas ao consumidor.