¹Í¡¨Ò¡¹ÕéáÁâ¤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)
¢³Ð¹Õ館³ÊÒÁÒöÃǺÃÇÁ áÅÐàÃÕ¡ãªéµÑÇãËéºÃÔ¡ÒáÒûÃѺ»Ãا àÁ×è͵éͧ¡Ò÷´Êͺ¡ÒÃãËéºÃÔ¡Òà »ÃѺà»ÅÕ蹢ͧ¼Ùé·´Êͺ µÒÁ·Õè͸ԺÒÂäÇé㹡ÒûÃѺà»ÅÕ蹢ͧ¼Ùéãªé¡Ñº¼ÙéãËéºÃÔ¡Ò÷Õè»ÃѺ»Ãا àÃÕ¡ãªé¼ÙéºÃÔâÀ¤·Õè·´Êͺ¡Ñº¼ÙéãËéºÃÔ¡Òà µÃǨÊͺÇèÒ ¼ÙéºÃÔâÀ¤·Õè·´Êͺ´Ö§ÊÒÂÍÑ¡¢ÃзÕè¶Ù¡µéͧ¨Ò¡¼ÙéãËéºÃÔ¡ÒÃàÁ×èͤس¤ÅÔ¡»ØèÁàÃÕ¡ãªéº¹¡ÅèͧâµéµÍº¡Ò÷´Êͺ¼ÙéºÃÔâÀ¤?