동적으로 결정 열 소비자에 게 반환

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)

이제 컴파일 하 고 향상 된 공급자를 실행할 수 있습니다. 공급자를 테스트 하려면 강화 된 공급자와 함께 사용 하기 위해 소비자 수정에 설명 된 대로 테스트 소비자를 수정 합니다. 공급자와 함께 테스트 소비자를 실행 합니다. 테스트 소비자 대화 상자에서 실행 단추를 클릭 하는 경우 공급자에서 테스트 소비자에 게 적절 한 문자열을 검색 확인。

OLE DB 템플릿 공급자 구현을 돌아가기

Index