Ẻ䴹ÒÁÔ¡¡Ó˹´¤ÍÅÑÁ¹ìÊè§¡ÅѺä»Âѧ¼ÙéºÃÔâÀ¤

¹Í¡¨Ò¡¹ÕéáÁâ¤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 (âÁ¦Ð * pThis, ULONG * pcCols);
   µÑÇ´Óà¹Ô¹¡Òà bool == (const CAgentManamp; am)
   {
      ¡ÅѺ (lstrcmpi (szCommand, am.szCommand) == 0);
   }

}(&A)

¶Ñ´ä» »¯ÔºÑµÔ¡Òà _GetColumnInfo §Ò¹ã¹ MyProviderRS.cpp µÒÁ·ÕèáÊ´§ã¹ÃËÑʵèÍ仹Õé?

_GetColumnInfoáá·Õè´Ù¶éҤسÊÁºÑµÔ OLE DB DBPROP_IRowsetLocate¶Ù¡µÑ駤èÒ¡ÒõÃǨÊͺ à¾×èÍãËéä´é¤Ø³ÊÁºÑµÔ _GetColumnInfo ãªéà»ç¹µÑǪÕé ( pRowset ) ä»ÂѧÇѵ¶Ø rowset ¡Òà pThis ªÕéáÊ´§¶Ö§ªÑé¹·ÕèÊÃéÒ§ rowset («Öè§à»ç¹ªÑé¹·Õèà¡çº¡ÒÃáÁ»¤Ø³ÊÁºÑµÔ) _GetColumnInfo typecasts ¡Òà pThis ªÕéä» RMyProviderRowset µÑǪÕé?

¡ÒõÃǨÊͺ¤Ø³ÊÁºÑµÔDBPROP_IRowsetLocate , _GetColumnInfo ãªéà¿ÊIRowsetInfo«Ö觤سÊÒÁÒö¢ÍÃѺâ´Ââ·ÃQueryInterfaceº¹ pRowset ÍÔ¹à·ÍÃìà¿« (á·¹ ¤Ø³ÊÒÁÒöãªé¡Òà ATL CComQIPtrá·¹)

////////////////////////////////////////////////////////////////////
/ / MyProviderRS.cpp
ATLCOLUMNINFO * CAgentMan::_GetColumnInfo(void* pThis, ULONG* pcCols)
{
   _rgColumns ATLCOLUMNINFO ¤§ [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 ++
      }
   }

/ / Next µÑ駤ÍÅÑÁ¹ìÍ×è¹ æ
   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] = (BYTE) ÁÒµÃÒ \
   .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] = (BYTE) ÁÒµÃÒ \
   .cbOffset _rgColumns [ulCols] = offsetof (dataClass ÊÁÒªÔ¡); \
   memset(amp;(_rgColumns[ulCols].columnid), 0, sizeof(DBID)) \
   .columnid.uName.pwszName _rgColumns [ulCols] =ª×èÍ (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