Изменение наследования 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
интерфейс при использовании остальной части реализации для класса набора строк.
После этого можно динамически определить столбцы, возвращаемые потребителю.