Modifica dell'ereditarietà di RCustomRowset
Per aggiungere l'interfaccia IRowsetLocate
al semplice esempio di provider di sola lettura, modificare l'ereditarietà di CCustomRowset
. Inizialmente eredita CCustomRowset
da CRowsetImpl
. È necessario modificarlo per ereditare da CRowsetBaseImpl
.
A tale scopo, creare una nuova classe, , CCustomRowsetImpl
in 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 >>
{
...
};
Modificare ora la mappa dell'interfaccia COM in CustomRS.h in modo che sia la seguente:
BEGIN_COM_MAP(CMyRowsetImpl)
COM_INTERFACE_ENTRY(IRowsetLocate)
COM_INTERFACE_ENTRY_CHAIN(_RowsetBaseClass)
END_COM_MAP()
Questo codice crea una mappa dell'interfaccia COM che indica CMyRowsetImpl
di chiamare QueryInterface
entrambe le IRowset
interfacce e IRowsetLocate
. Per ottenere tutte le implementazioni per le altre classi di set di righe, la mappa collega nuovamente la CMyRowsetImpl
classe alla CRowsetBaseImpl
classe definita dai modelli OLE DB. La mappa usa la macro COM_INTERFACE_ENTRY_CHAIN, che indica ai modelli OLE DB di analizzare la mappa COM in CRowsetBaseImpl
risposta a una QueryInterface
chiamata.
Infine, collegarsi CCustomRowset
a CMyRowsetBaseImpl
modificando CCustomRowset
per ereditare da CMyRowsetImpl
, come indicato di seguito:
class CCustomRowset : public CMyRowsetImpl<CCustomRowset, CCustomWindowsFile, CCustomCommand>
CCustomRowset
può ora usare l'interfaccia IRowsetLocate
sfruttando il resto dell'implementazione per la classe del set di righe.
Al termine, è possibile determinare in modo dinamico le colonne restituite al consumer.