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 оператор == (константа CAgentManamp; ранку)
{
повернення (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
# визначити &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, член);
# визначити 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)
Тепер можна скомпілювати і запустити розширений постачальника. Для перевірки провайдера, змінити випробування споживача, як описано в модифікації споживача для використання цього постачальника розширення. Запустити тест споживачів з провайдером. Переконайтеся, що споживчі тестування отримує належної рядків від постачальника, після натискання кнопки запустити тест споживачів у діалоговому вікні.