Normalerweise behandeln die PROVIDER_COLUMN_ENTRY -Makros verwendet den IColumnsInfo:: GetColumnsInfo -Aufruf. Da ein Verbraucher kann oder kann nicht wählen Sie Lesezeichen verwenden, muss der Anbieter jedoch in der Lage, je nachdem ob der Verbraucher ein Lesezeichen fordert zurückgegebenen Spalten ändern.
Um den IColumnsInfo:: GetColumnsInfo -Aufruf zu verarbeiten, löschen Sie die PROVIDER_COLUMN_MAP (die eine Funktion definiert _GetColumnInfo ) aus der CAgentMan Benutzer in der Datei MyProviderRS.h aufzeichnen und ersetzen Sie ihn durch die eigene Definition _GetColumnInfo Funktion
////////////////////////////////////////////////////////////////////////
/ / Datei MyProviderRS.H
Klasse C&AgentMan
{
Öffentliche:
DWORD DwBookmark;
TCHAR SzCommand [256];
TCHAR SzText [256];
TCHAR szCommand2 [256];
TCHAR szText2 [256];
statische ATLCOLUMNINFO * _GetColumnInfo (Void * pThis, ULONG * PcCols);
Bool Operator == (const CAgentManamp; am)
{
zurück (Lstrcmpi SzCommand (am.szCommand) == 0);
}
}
Als Nächstes implementieren die _GetColumnInfo -Funktion in MyProviderRS.cpp, wie im folgenden Code gezeigt.
_GetColumnInfoüberprüft zuerst, ob der OLE DB-Eigenschaft DBPROP_IRowsetLocate festgelegt ist. Zum Abrufen der Eigenschaft _GetColumnInfo verwendet einen Zeiger ( pRowset ) auf das Rowsetobjekt. Der pThis -Zeiger stellt die Klasse, die das Rowset erstellt (die Klasse ist in dem die Eigenschaftenzuordnung gespeichert). _GetColumnInfo Typecasts der pThis Zeiger auf eine RMyProviderRowset Zeiger.
Für die DBPROP_IRowsetLocate -Eigenschaft überprüfen _GetColumnInfo verwendet die IRowsetInfo -Schnittstelle, die Sie abrufen können, durch Aufrufen von QueryInterface auf der pRowset Schnittstelle. (Als Alternative können Sie ein ATL CComQIPtr stattdessen verwenden.)
////////////////////////////////////////////////////////////////////
/ / MyProviderRS.cpp
ATLCOLUMNINFO * CAgentMan::_GetColumnInfo(void* pThis, ULONG* pcCols)
{
statische ATLCOLUMNINFO _rgColumns [5];
ULONG UlCols = 0;
/ / Check Eigenschaftsflag für Lesezeichen, wenn festgelegt ist, legen Sie die NULL Ordnungszahl
/ / Eintrag in der Spalte mit den Lesezeichen-Informationen anzeigen.
CAgentRowset * pRowset = (CAgentRowset **) pThis;
CComQIPtrlt; IRowsetInfo & IID_IRowsetInfo > SpRowsetProps = pRowset;
CDBPropIDSet set(DBPROPSET_ROWSET);
festgelegt.AddPropertyID(DBPROP_BOOKMARKS);
DBPROPSET * pPropSet = NULL;
ULONG UlPropSet = 0;
HRESULT hr;
Wenn (SpRowsetProps)
HR = SpRowsetProps - > GetProperties (1, Satz, & UlPropSet & pPropSet);
Wenn (pPropSet)
{
CComVariant Var = pPropSet - > RgProperties [0] .vvalue;
CoTaskMemFree (pPropSet - > RgProperties);
CoTaskMemFree(pPropSet);
Wenn (SUCCEEDED(hr) & & (var.boolVal == VARIANT_TRUE))
{
ADD_COLUMN_ENTRY_EX (UlCols, OLESTR("Bookmark"), 0, sizeof(DWORD), DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, DwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)
UlCols ++;
}
}
/ / Weiter die anderen Spalten eingerichtet.
ADD_COLUMN_ENTRY (UlCols, OLESTR("Command"), 1, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, SzCommand)
UlCols ++;
ADD_COLUMN_ENTRY (UlCols, OLESTR("Text"), 2, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, SzText)
UlCols ++;
ADD_COLUMN_ENTRY (UlCols, OLESTR("Command2"), 3, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szCommand2)
UlCols ++;
ADD_COLUMN_ENTRY (UlCols, OLESTR("Text2"), 4, 256, DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szText2)
UlCols ++;
Wenn (PcCols! = NULL)
* PcCols = UlCols;
Rückkehr _rgColumns;
}
In diesem Beispiel verwendet ein statisches Array die Spaltendaten enthalten. Wenn der Verbraucher die Lesezeichenspalte nicht will, ist ein Eintrag im Array unbenutzt. Um die Informationen zu behandeln, erstellen Sie zwei Array-Makros, ADD_COLUMN_ENTRY und ADD_COLUMN_ENTRY_EX. ADD_COLUMN_ENTRY_EX nimmt einen zusätzlichen Parameter, flags , das ist erforderlich, wenn Sie eine Lesezeichenspalte festlegen.
////////////////////////////////////////////////////////////////////////
/ / Datei MyProviderRS.h
# define &ADD_COLUMN_ENTRY (UlCols, Name, Ordnungszahl, ColSize, Typ, Genauigkeit, Skalierung, Guid, DataClass, Mitglied) \
_rgColumns [UlCols] .pwszname = Name (LPOLESTR); \
_rgColumns [UlCols] .ptypeinfo = (ITypeInfo **) NULL; \
_rgColumns [UlCols] .iordinal = (ULONG) Ordnungszahl; \
_rgColumns [UlCols] .dwflags = 0; \
_rgColumns [UlCols] .ulcolumnsize = ColSize (ULONG); \
_rgColumns [UlCols] .wtype = (DBTYPE) Typ; \
.bPrecision _rgColumns [UlCols] = (BYTE) die Genauigkeit; \
.bScale _rgColumns [UlCols] = (BYTE) Scale; \
_rgColumns [UlCols] .cboffset = Offsetof (DataClass, Mitglied);
# define ADD_COLUMN_ENTRY_EX (UlCols, Name, Ordnungszahl, ColSize, Type, Genauigkeit, Skala, Guid, DataClass, Mitglied, Flaggen) \
_rgColumns [UlCols] .pwszname = Name (LPOLESTR); \
_rgColumns [UlCols] .ptypeinfo = (ITypeInfo **) NULL; \
_rgColumns [UlCols] .iordinal = (ULONG) Ordnungszahl; \
_rgColumns [UlCols] .dwflags = Flags; \
_rgColumns [UlCols] .ulcolumnsize = ColSize (ULONG); \
_rgColumns [UlCols] .wtype = (DBTYPE) Typ; \
.bPrecision _rgColumns [UlCols] = (BYTE) die Genauigkeit; \
.bScale _rgColumns [UlCols] = (BYTE) Scale; \
_rgColumns [UlCols] .cboffset = Offsetof (DataClass, Mitglied); \
memset(amp;(_rgColumns[ulCols].columnID), 0, sizeof(DBID)); \
_rgColumns [UlCols].columnid.uName.pwszName = Name (LPOLESTR)
In der _GetColumnInfo ist das Lesezeichen Makro-Funktion wie folgt benutzt:
ADD_COLUMN_ENTRY_EX (UlCols, OLESTR("Bookmark"), 0, sizeof(DWORD),
DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, DwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)
Sie können jetzt kompilieren und Ausführen den enhanced Provider. Um den Anbieter zu testen, ändern Sie den Testconsumer wie beim Ändern des Verbrauchers für die Verwendung mit der Enhanced Providerbeschrieben. Führen Sie den Testconsumer mit dem Provider. Stellen Sie sicher, dass der Testconsumer die richtigen Zeichenfolgen vom Provider abruft, wenn Sie klicken Sie auf die Schaltfläche Ausführen im Dialogfeld Test Verbraucher.