Выполнение макроса PROVIDER_COLUMN_ENTRY как правило обработки вызова IColumnsInfo::GetColumnsInfo . Поскольку потребитель может или не можете использовать закладки, однако, поставщик должен иметь возможность изменить столбцы, возвращаемые в зависимости от ли потребитель запрашивает закладки.
Для обработки вызова IColumnsInfo::GetColumnsInfo , удаление PROVIDER_COLUMN_MAP (который определяет функцию _GetColumnInfo ) из CAgentMan пользователем записи в MyProviderRS.h и заменить ее с определением для собственного _GetColumnInfo функция
////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.H
класс C&AgentMan
{
общественности:
DWORD dwBookmark;
TCHAR szCommand [256];
TCHAR szText [256];
TCHAR szCommand2 [256];
TCHAR szText2 [256];
статический ATLCOLUMNINFO * _GetColumnInfo (void * pThis, ULONG * pcCols);
bool оператор == (const CAgentManamp; am)
{
возвращение (lstrcmpi (szCommand, am.szCommand) == 0);
}
}
Далее, осуществить _GetColumnInfo работать в MyProviderRS.cpp, как показано в следующем коде.
_GetColumnInfoпроверяет первыми увидеть, если свойство OLE DB DBPROP_IRowsetLocate имеет значение. Чтобы получить значение свойства, _GetColumnInfo использует указатель ( pRowset ) для объекта набора строк. pThisУказатель представляет класс, созданный набор строк (что класс хранения сопоставление свойств). _GetColumnInfo typecasts pThis указатель на RMyProviderRowset указатель.
Чтобы проверить для свойства DBPROP_IRowsetLocate _GetColumnInfo использует интерфейс IRowsetInfo , который можно получить путем вызова QueryInterface на pRowset интерфейс. (В качестве альтернативы можно использовать ATL CComQIPtr .)
////////////////////////////////////////////////////////////////////
/ / MyProviderRS.cpp
ATLCOLUMNINFO * CAgentMan::_GetColumnInfo(void* pThis, ULONG* pcCols)
{
статический ATLCOLUMNINFO _rgColumns [5];
ULONG ulCols = 0;
/ / Проверка свойства флага для закладки, если это, установки нуля порядковый номер
/ / запись в столбце карта с информацией закладки.
CAgentRowset * pRowset = (CAgentRowset *) pThis;
CComQIPtrlt; IRowsetInfo, & IID_IRowsetInfo > spRowsetProps = pRowset;
CDBPropIDSet set(DBPROPSET_ROWSET);
Задайте.AddPropertyID(DBPROP_BOOKMARKS);
DBPROPSET * pPropSet = NULL;
ULONG ulPropSet = 0;
HRESULT hr;
Если (spRowsetProps)
HR = spRowsetProps - > GetProperties (1 и набор и ulPropSet и pPropSet);
Если (pPropSet)
{
CComVariant var = pPropSet - > .vvalue rgProperties [0];
CoTaskMemFree (pPropSet - > rgProperties);
CoTaskMemFree(pPropSet);
Если (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 ++;
}
}
/ / Далее устанавливаем другие столбцы.
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 ++;
Если (pcCols! = NULL)
* pcCols = ulCols;
возвращение _rgColumns;
}
В этом примере используется статический массив, который содержит сведения о столбцах. Если потребитель не хочет столбца закладки, одна запись в массиве не используется. Для обработки информации, создаются два массива макросы, ADD_COLUMN_ENTRY и ADD_COLUMN_ENTRY_EX. ADD_COLUMN_ENTRY_EX принимает дополнительный параметр, flags , то есть требуется при указании столбца закладки.
////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h
# define &ADD_COLUMN_ENTRY (ulCols, имя, порядковый номер, colSize, тип, точность, масштаб, guid, dataClass, член) \
.pwszName _rgColumns [ulCols] = имя (LPOLESTR); \
.pTypeInfo _rgColumns [ulCols] = (ITypeInfo *) NULL; \
.iOrdinal _rgColumns [ulCols] = порядковый номер (ULONG); \
.dwFlags _rgColumns [ulCols] = 0; \
.ulColumnSize _rgColumns [ulCols] = colSize (ULONG); \
.wType _rgColumns [ulCols] = тип (DBTYPE); \
.bPrecision _rgColumns [ulCols] = точность (БАЙТ); \
.bScale _rgColumns [ulCols] = масштаба (БАЙТ); \
.cbOffset _rgColumns [ulCols] = offsetof (dataClass, член);
# define ADD_COLUMN_ENTRY_EX (ulCols, имя, порядковый номер, colSize, тип, точность, масштаб, guid, dataClass, член, флаги) \
.pwszName _rgColumns [ulCols] = имя (LPOLESTR); \
.pTypeInfo _rgColumns [ulCols] = (ITypeInfo *) NULL; \
.iOrdinal _rgColumns [ulCols] = порядковый номер (ULONG); \
.dwFlags _rgColumns [ulCols] = флагов; \
.ulColumnSize _rgColumns [ulCols] = colSize (ULONG); \
.wType _rgColumns [ulCols] = тип (DBTYPE); \
.bPrecision _rgColumns [ulCols] = точность (БАЙТ); \
.bScale _rgColumns [ulCols] = масштаба (БАЙТ); \
.cbOffset _rgColumns [ulCols] = offsetof (dataClass, член); \
memset(amp;(_rgColumns[ulCols].columnid), 0, sizeof(DBID)); \
.columnid.uName.pwszName _rgColumns [ulCols] = имя (LPOLESTR)
В _GetColumnInfo как это используется функция, макрос закладки:
ADD_COLUMN_ENTRY_EX (ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD),
DBTYPE_BYTES, 0, 0, — GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)
Теперь можно скомпилировать и запустить расширенной поставщика. Чтобы протестировать поставщика, измените тестовый объект-получатель, как описано в изменении потребителя для использования с поставщиком Улучшено. Запустите тестовый объект-получатель вместе с поставщиком. Убедитесь, что тестовый объект-получатель получает надлежащее строки от поставщика при нажатии кнопки выполнить в диалоговом окне потребительские тест.