PROVIDER_COLUMN_ENTRY 매크로 일반적으로 IColumnsInfo::GetColumnsInfo 호출을 처리합니다. 그러나 때문에 소비자는 책갈피를 사용 하도록 선택 하지 않을 수 있습니다 수도 있습니다,, 공급자 수 있어야 소비자는 책갈피에 대 한 요청 하는 여부에 따라 반환 되는 열을 변경 하려면。
IColumnsInfo::GetColumnsInfo 호출을 처리 하려면 PROVIDER_COLUMN_MAP 을 삭제 (함수를 정의 하는 _GetColumnInfo )에서 해당 CAgentMan 사용자 Myproviderrs.h에 기록 하 고 고객님에 대 한 정의로 대체 _GetColumnInfo 함수
////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.H
클래스 CAgentMan
{
공개:
DWORD dwBookmark;
TCHAR szCommand [256];
TCHAR szText [256];
TCHAR szCommand2 [256];
TCHAR szText2 [256];
정적 ATLCOLUMNINFO * _GetColumnInfo (void * pThis, ULONG * pcCols);
부울 연산자 = = const CAgentManamp (오전)
{
반환 (lstrcmpi (szCommand, am.szCommand) = = 0);
}
}(&A)
그런 다음 구현에서 _GetColumnInfo 다음 코드와 같이 MyProviderRS.cpp, 기능。
_GetColumnInfoOLE DB 속성 DBPROP_IRowsetLocate 설정 되어 있는지를 먼저를 확인 합니다. 속성을 가져오는 _GetColumnInfo 포인터를 사용 하 여 ( pRowset )는 행 집합 개체를. pThis포인터 (이 클래스 속성 맵에 저장 된) 행 집합을 만든 클래스를 나타냅니다. _GetColumnInfo typecasts는 pThis 에 대 한 포인터를 RMyProviderRowset 포인터。
DBPROP_IRowsetLocate 속성을 확인 하려면 _GetColumnInfo 에서 QueryInterface 호출 의해 얻을 수 있는 IRowsetInfo 인터페이스를 사용 하는 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-> rgProperties [0].vvalue;
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, 구성원) \
_rgColumns [ulCols].pwszname (LPOLESTR) 이름; = \
_rgColumns [ulCols].ptypeinfo = (ITypeInfo *) NULL; \
_rgColumns [ulCols].iordinal = (ULONG) 서; \
_rgColumns [ulCols].dwflags = 0; \
_rgColumns [ulCols].ulcolumnsize = (ULONG) colSize; \
_rgColumns [ulCols].wtype = (DBTYPE) 유형; \
_rgColumns [ulCols].bprecision = (바이트) 정밀도; \
_rgColumns [ulCols].bscale = (바이트) 규모; \
_rgColumns [ulCols].cboffset = offsetof (dataClass, 회원);
# define ADD_COLUMN_ENTRY_EX (ulCols, 이름, 서, colSize, 형식, 정밀도, 배율, guid, dataClass, 구성원, 플래그) \
_rgColumns [ulCols].pwszname (LPOLESTR) 이름; = \
_rgColumns [ulCols].ptypeinfo = (ITypeInfo *) NULL; \
_rgColumns [ulCols].iordinal = (ULONG) 서; \
_rgColumns [ulCols].dwflags 플래그; = \
_rgColumns [ulCols].ulcolumnsize = (ULONG) colSize; \
_rgColumns [ulCols].wtype = (DBTYPE) 유형; \
_rgColumns [ulCols].bprecision = (바이트) 정밀도; \
_rgColumns [ulCols].bscale = (바이트) 규모; \
_rgColumns [ulCols].cboffset = offsetof (dataClass, 회원); \
memset(amp;(_rgColumns[ulCols].columnid), 0, sizeof(DBID)); \
_rgColumns [ulCols].columnid.uName.pwszName = (LPOLESTR) 이름(&A)
에 _GetColumnInfo 함수, 책갈피 매크로이 같은 사용:
ADD_COLUMN_ENTRY_EX (ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD),
DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)
이제 컴파일 하 고 향상 된 공급자를 실행할 수 있습니다. 공급자를 테스트 하려면 강화 된 공급자와 함께 사용 하기 위해 소비자 수정에 설명 된 대로 테스트 소비자를 수정 합니다. 공급자와 함께 테스트 소비자를 실행 합니다. 테스트 소비자 대화 상자에서 실행 단추를 클릭 하는 경우 공급자에서 테스트 소비자에 게 적절 한 문자열을 검색 확인。