Поделиться через


Изменение наследования RCustomRowset

Чтобы добавить интерфейс в IRowsetLocate простой пример поставщика только для чтения, измените наследование CCustomRowset. Изначально наследуется CCustomRowset от CRowsetImpl. Его необходимо изменить, чтобы наследовать от CRowsetBaseImpl.

Для этого создайте новый класс CCustomRowsetImplв customRS.h:

////////////////////////////////////////////////////////////////////////
// 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 >>
{
...
};

Теперь измените карту COM-интерфейса в CustomRS.h следующим образом:

BEGIN_COM_MAP(CMyRowsetImpl)
   COM_INTERFACE_ENTRY(IRowsetLocate)
   COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()

Этот код создает карту COM-интерфейса, которая указывает на вызов QueryInterface как для интерфейсов, так CMyRowsetImpl и IRowsetLocate для IRowset интерфейсов. Чтобы получить всю реализацию для других классов набора строк, карта связывает CMyRowsetImpl класс обратно с CRowsetBaseImpl классом, определенным шаблонами OLE DB; карта использует макрос COM_INTERFACE_ENTRY_CHAIN, который сообщает OLE DB шаблонам сканировать com-карту в CRowsetBaseImpl ответ на QueryInterface вызов.

Наконец, перейдите по ссылке CCustomRowset CMyRowsetBaseImpl , изменив CCustomRowset наследование от CMyRowsetImplследующего:

class CCustomRowset : public CMyRowsetImpl<CCustomRowset, CCustomWindowsFile, CCustomCommand>

CCustomRowset теперь можно использовать IRowsetLocate интерфейс при использовании остальной части реализации для класса набора строк.

После этого можно динамически определить столбцы, возвращаемые потребителю.

См. также

Усовершенствование простого поставщика только для чтения