Изменение порядка наследования класса RMyProviderRowset
Чтобы добавить интерфейс IRowsetLocate к примеру простого поставщика, предназначенного только для чтения, измените порядок наследования класса RMyProviderRowset. Изначально класс RMyProviderRowset наследуется от класса CRowsetImpl. В этом случае необходимо определить его наследование от класса CRowsetBaseImpl.
Для этого создайте в файле MyProviderRS.h новый класс CMyRowsetImpl:
////////////////////////////////////////////////////////////////////////
// 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 > >
{
...
};
В файле MyProviderRS.h измените схему интерфейса COM следующим образом:
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
При этом создается схема интерфейса COM, в которой определяется вызов в классе CMyRowsetImpl метода QueryInterface одновременно для интерфейсов IRowset и IRowsetLocate. Чтобы получить все реализации других классов набора строк, класс CMyRowsetImpl повторно связывается в схеме с классом CRowsetBaseImpl, определенным в шаблонах OLE DB. В схеме используется макрос COM_INTERFACE_ENTRY_CHAIN, в котором определяется поиск с помощью шаблонов OLE DB в схеме COM класса CRowsetBaseImpl при вызове метода QueryInterface.
Свяжите класс RAgentRowset с классом CMyRowsetBaseImpl. Для этого определите наследование класса RAgentRowset от CMyRowsetImpl, как показано ниже:
class RAgentRowset : public CMyRowsetImpl<RAgentRowset, CAgentMan, CMyProviderCommand>
После этого в классе RAgentRowset можно использовать интерфейс IRowsetLocate, а также возможности остальных реализаций класса набора строк.
По завершении можно выполнить динамическое определение столбцов, возвращаемых в объект-получатель.