Las macros PROVIDER_COLUMN_ENTRY manejan normalmente la llamada IColumnsInfo::GetColumnsInfo . Dado que un consumidor puede o no puede utilizar marcadores, sin embargo, el proveedor debe ser capaz de cambiar las columnas devueltas dependiendo de si el consumidor pide un marcador.
Para controlar la llamada IColumnsInfo::GetColumnsInfo , eliminar el PROVIDER_COLUMN_MAP (que define una función _GetColumnInfo ) desde el CAgentMan usuario Registre en MyProviderRS.h y reemplazarla con la definición de su propio _GetColumnInfo función
////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.H
clase C&AgentMan
{
público:
DWORD dwBookmark;
TCHAR szCommand [256];
TCHAR szText [256];
TCHAR szCommand2 [256];
TCHAR szText2 [256];
estática ATLCOLUMNINFO * _GetColumnInfo (void * pThis, ULONG * pcCols);
bool operador == (const CAgentManamp; am)
{
Return (lstrcmpi (szCommand, am.szCommand) == 0);
}
}
A continuación, aplicar el _GetColumnInfo funciona en MyProviderRS.cpp, como se muestra en el siguiente código.
_GetColumnInfocomprueba primero si la propiedad OLE DB DBPROP_IRowsetLocate está establecida. Para obtener la propiedad _GetColumnInfo utiliza un puntero ( pRowset ) con el objeto de conjunto de filas. El pThis puntero representa la clase que creó el conjunto de filas (que es la clase donde se almacena el mapa de propiedades). _GetColumnInfo typecasts el pThis puntero a un RMyProviderRowset puntero.
Para comprobar la propiedad DBPROP_IRowsetLocate , _GetColumnInfo utiliza la interfaz IRowsetInfo , que puede obtener por llamada QueryInterface en el pRowset interfaz. (Como alternativa, puede utilizar un ATL CComQIPtr en su lugar.)
////////////////////////////////////////////////////////////////////
/ / MyProviderRS.cpp
ATLCOLUMNINFO * CAgentMan::_GetColumnInfo(void* pThis, ULONG* pcCols)
{
estática ATLCOLUMNINFO _rgColumns [5];
ULONG ulCols = 0;
/ / Comprobar la bandera propiedad de marcadores, si es definir, definir el cero ordinal
/ / Mapa de entrada en la columna con la información del marcador.
CAgentRowset * pRowset = (CAgentRowset **) pThis;
CComQIPtrlt; IRowsetInfo, & IID_IRowsetInfo > spRowsetProps = pRowset;
CDBPropIDSet set(DBPROPSET_ROWSET);
conjunto.AddPropertyID(DBPROP_BOOKMARKS);
DBPROPSET * pPropSet = NULL;
ULONG ulPropSet = 0;
HRESULT hr;
Si (spRowsetProps)
HR = spRowsetProps - > GetProperties (1, conjunto & ulPropSet & pPropSet);
Si (pPropSet)
{
Var CComVariant = pPropSet - > .vvalue rgProperties [0];
CoTaskMemFree (pPropSet - > rgProperties);
CoTaskMemFree(pPropSet);
Si (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 ++;
}
}
/ / Establecer a continuación las otras columnas.
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 ++;
Si (pcCols! = NULL)
* pcCols = ulCols;
Return _rgColumns;
}
Este ejemplo utiliza una matriz estática para contener la información de la columna. Si el consumidor no desea que la columna de marcador, una entrada en la matriz no se utiliza. Para manejar la información, crear dos macros de matriz, ADD_COLUMN_ENTRY y ADD_COLUMN_ENTRY_EX. ADD_COLUMN_ENTRY_EX toma un parámetro adicional, flags , es necesario si designa una columna de marcador.
////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
# define &ADD_COLUMN_ENTRY (ulCols, nombre, ordinal, colSize, tipo, precisión, escala, guid, dataClass, miembro) \
_rgColumns [ulCols] .pwszname = nombre (LPOLESTR); \
_rgColumns [ulCols] .ptypeinfo = (ITypeInfo **) NULL; \
_rgColumns [ulCols] .iordinal = ordinal (ULONG); \
_rgColumns [ulCols] .dwflags = 0; \
_rgColumns [ulCols] .ulcolumnsize = colSize (ULONG); \
_rgColumns [ulCols] .wtype = tipo (DBTYPE); \
_rgColumns [ulCols] .bprecision = precisión (BYTE); \
_rgColumns [ulCols] .bscale = escala (BYTE); \
_rgColumns [ulCols] .cboffset = offsetof (dataClass, miembro);
# define ADD_COLUMN_ENTRY_EX (ulCols, nombre, ordinal, colSize, tipo, precisión, escala, guid, dataClass, miembro, banderas) \
_rgColumns [ulCols] .pwszname = nombre (LPOLESTR); \
_rgColumns [ulCols] .ptypeinfo = (ITypeInfo **) NULL; \
_rgColumns [ulCols] .iordinal = ordinal (ULONG); \
_rgColumns [ulCols] .dwflags = banderas; \
_rgColumns [ulCols] .ulcolumnsize = colSize (ULONG); \
_rgColumns [ulCols] .wtype = tipo (DBTYPE); \
_rgColumns [ulCols] .bprecision = precisión (BYTE); \
_rgColumns [ulCols] .bscale = escala (BYTE); \
_rgColumns [ulCols] .cboffset = offsetof (dataClass, miembro); \
memset(amp;(_rgColumns[ulCols].columnid), 0, sizeof(DBID)); \
_rgColumns [ulCols].columnid.uName.pwszName = nombre (LPOLESTR)
En el _GetColumnInfo se utiliza como esta función, la macro de marcador:
ADD_COLUMN_ENTRY_EX (ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD),
DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)
Ahora puede compilar y ejecutar el mayor proveedor. Para probar el proveedor, modificar el consumidor de prueba, como se describe en modificar el consumidor para su uso con el proveedor mejorado. Ejecutar el consumidor de prueba con el proveedor. Compruebe que el consumidor prueba recupera las cadenas adecuadas del proveedor al hacer clic en el botón ejecutar en el cuadro de diálogo de consumidor de prueba.