MFC之COleVariant类
?
COleVariant?本質上是一個枚舉,用同一種類型來表達不同的子類型。如同boost中的variant。
COleVariant類是對VARIANT結構的封裝。
VARIANT 結構包含兩部分。其一是 VARTYPE 型的成員變量vt;其二是個聯合類型,這個聯合包含了VC常用的幾乎所有類型。因為聯合用的是相同的存儲空間,因此對聯合的內容的解釋依賴于 vt。
例如,
若 vt 的值是 VT_UI2, 說明該聯合被解釋為short int. 并使用成員變量名 iVal。
若 vt 的的值是 VT_BSTR,說明該聯合被解釋為 BSTR 類型。并使用成員變量名 bstrVal。
若 vt 的的值是 VT_BSTR|VT_BYREF,說明該聯合被解釋為BSTR 型指針。并使用成員變量名 pbstrVal。
它的構造函數具有極為強大的功能,當對象構造時首先調用VariantInit進行 初始化,然后根據參數中的標準類型調用相應的構造函數,并使用VariantCopy進行轉換賦值操作,當VARIANT對象不在有效范圍時,它的析構函 數就會被自動調用,由于析構函數調用了VariantClear,因而相應的內存就會被自動清除。除此之外,COleVariant的賦值操作符在與 VARIANT類型轉換中為我們提供極大的方便。
?
若從數據庫返回的是簡單類型,如 short, long, 等,則直接引用既可。(主持人注:COleVariant類重載了“=”操作符,所以常用類型可以直接轉換)若返回的是字符串類型,則有可能是 bstrVal 或pbstrVal。依賴于數據庫服務程序。 BSTR 實際上就是個unicode 字符串,CString 的構造函數和賦值操作都能直接識別這一類型。
????
????AndySun問:
????VARIANT結構的vt成員可以為值VT_DECIMAL,當然,這個值在MSDN的幫助中似乎沒有,但在VARIANT定義的源文件中確實有它的定義,它是在wtypes.h文件中定義的。但我不明白怎樣將VT_DECIMAL的數據轉換成常用的C數據類型,更想知道 VT_DECIMAL中究竟存放的是一個怎樣的數據,應怎樣將這個數據顯示出來。謝謝!
????李海答:你可以使用COleVariant的ChangeType函數(相當于API函數VariantChangeType)將VT_DECIMAL轉換為其他常用類型。
?
?例子
1 [cpp] view plaincopyprint? 2 01.COleVariant var(3.6f); 3 02.float v = var.fltVal; 4 03.CString str("testCOleVariant"); 5 04.COleVariant var2(str); 6 05.CString cpStr(var2.bstrVal);??例子
01.CString CMFCPropertyGridProperty::m_strFormatChar = _T("%c"); 02.CString CMFCPropertyGridProperty::m_strFormatShort = _T("%d"); 03.CString CMFCPropertyGridProperty::m_strFormatLong = _T("%ld"); 04.CString CMFCPropertyGridProperty::m_strFormatUShort = _T("%u"); 05.CString CMFCPropertyGridProperty::m_strFormatULong = _T("%u"); 06.CString CMFCPropertyGridProperty::m_strFormatFloat = _T("%f"); 07.CString CMFCPropertyGridProperty::m_strFormatDouble = _T("%lf"); 08. 09.CString CMFCPropertyGridProperty::FormatProperty() 10.{ 11. ASSERT_VALID(this); 12. ASSERT_VALID(m_pWndList); 13. 14. COleVariant& var = m_varValue; 15. 16. CString strVal; 17. 18. ............. 19. 20. switch (var.vt) 21. { 22. case VT_BSTR: 23. strVal = var.bstrVal; 24. break; 25. 26. case VT_I2: 27. strVal.Format(m_strFormatShort, (short)var.iVal); 28. break; 29. 30. case VT_I4: 31. case VT_INT: 32. strVal.Format(m_strFormatLong, (long)var.lVal); 33. break; 34. 35. case VT_UI1: 36. if ((BYTE)var.bVal != 0) 37. { 38. strVal.Format(m_strFormatChar, (TCHAR)(BYTE)var.bVal); 39. } 40. break; 41. 42. case VT_UI2: 43. strVal.Format( m_strFormatUShort, var.uiVal); 44. break; 45. 46. case VT_UINT: 47. case VT_UI4: 48. strVal.Format(m_strFormatULong, var.ulVal); 49. break; 50. 51. case VT_R4: 52. strVal.Format(m_strFormatFloat, (float)var.fltVal); 53. break; 54. 55. case VT_R8: 56. strVal.Format(m_strFormatDouble, (double)var.dblVal); 57. break; 58. 59. case VT_BOOL: 60. strVal = var.boolVal == VARIANT_TRUE ? m_pWndList->m_strTrue : m_pWndList->m_strFalse; 61. break; 62. 63. default: 64. // Unsupported type 65. strVal = _T("*** error ***"); 66. } 67. 68. return strVal; 69.}?
COleVariant框架內容
?
01.class COleVariant : public tagVARIANT 02.{ 03. COleVariant(LPCTSTR lpszSrc); 04. COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string 05. COleVariant(CString& strSrc); 06. 07. COleVariant(BYTE nSrc); 08. COleVariant(short nSrc, VARTYPE vtSrc = VT_I2); 09. COleVariant(long lSrc, VARTYPE vtSrc = VT_I4); 10. COleVariant(const COleCurrency& curSrc); 11. 12. COleVariant(float fltSrc); 13. COleVariant(double dblSrc); 14. COleVariant(const COleDateTime& timeSrc); 15..................................... 16. const COleVariant& operator=(float fltSrc); 17. const COleVariant& operator=(double dblSrc); 18. const COleVariant& operator=(const COleDateTime& dateSrc); 19. 20. const COleVariant& operator=(const CByteArray& arrSrc); 21. const COleVariant& operator=(const CLongBinary& lbSrc); 22.}; 23. 24. void Clear(); 25. void ChangeType(VARTYPE vartype, LPVARIANT pSrc = NULL); 26. void Attach(VARIANT& varSrc); 27. VARIANT Detach(); 28. void GetByteArrayFromVariantArray(CByteArray& bytes); 29.void SetString(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set ANSI string 30. operator LPVARIANT(); 31. operator LPCVARIANT() const 32./ 33.struct tagVARIANT 34. { union 35. { 36. struct __tagVARIANT 37. { 38. VARTYPE vt; 39. ....................... 40. union 41. { 42. LONGLONG llVal; 43. LONG lVal; 44. BYTE bVal; 45. SHORT iVal; 46. FLOAT fltVal; 47. DOUBLE dblVal; 48. ........... 49. DATE date; 50. BSTR bstrVal; 51. IUnknown *punkVal; 52. IDispatch *pdispVal; 53. .............. 54. } 55. 56.COleVariant::COleVariant(float fltSrc) 57. { vt = VT_R4; fltVal = fltSrc; } 58._AFXDISP_INLINE COleVariant::COleVariant(CString& strSrc) 59. { vt = VT_EMPTY; *this = strSrc; } 60. 61.const COleVariant& COleVariant::operator=(const CString& strSrc) 62.{ 63. // Free up previous VARIANT 64. Clear(); 65. 66. vt = VT_BSTR; 67. bstrVal = strSrc.AllocSysString(); 68. 69. return *this; 70. } 71. 72.typedef unsigned short VARTYPE; 73. 75. * VARENUM usage key, 76. * 77. * * [V] - may appear in a VARIANT 78. * * [T] - may appear in a TYPEDESC 79. * * [P] - may appear in an OLE property set 80. * * [S] - may appear in a Safe Array 81. * 82. * 83. * VT_EMPTY [V] [P] nothing 84. * VT_NULL [V] [P] SQL style Null 85. * VT_I2 [V][T][P][S] 2 byte signed int 86. * VT_I4 [V][T][P][S] 4 byte signed int 87. * VT_R4 [V][T][P][S] 4 byte real 88. * VT_R8 [V][T][P][S] 8 byte real 89. * VT_CY [V][T][P][S] currency 90. * VT_DATE [V][T][P][S] date 91. * VT_BSTR [V][T][P][S] OLE Automation string 92. * VT_DISPATCH [V][T] [S] IDispatch * 93. * VT_ERROR [V][T][P][S] SCODE 94. * VT_BOOL [V][T][P][S] True=-1, False=0 95. * VT_VARIANT [V][T][P][S] VARIANT * 96. * VT_UNKNOWN [V][T] [S] IUnknown * 97. * VT_DECIMAL [V][T] [S] 16 byte fixed point 98. ....................................... 99. 100.enum VARENUM 101. { VT_EMPTY = 0, 102. VT_NULL = 1, 103. VT_I2 = 2, 104. VT_I4 = 3, 105. VT_R4 = 4, 106. VT_R8 = 5, 107. VT_CY = 6, 108. VT_DATE = 7, 109. VT_BSTR = 8, 110. ......................................... 111. } ;?
COleVariant功能:
COleVariant類是對VARIANT結構的封裝。它的構造函數具有極為強大的功能:
1、當對象構造時首先調用VariantInit進行 初始化,然后根據參數中的標準類型調用相應的構造函數,并使用VariantCopy進行轉換賦值操作;
2、當VARIANT對象不在有效范圍時,它的析構函 數就會被自動調用,由于析構函數調用了VariantClear,因而相應的內存就會被自動清除。
COleVariant是數據庫常用到的數據類型。它可以是字串,整型值,日期等。知道怎樣將它轉換為CString很有用處。
例如:設有CString A; COleVariant B; 來看看怎樣將COleVariant轉換為CString:
switch(B.vt){
case VT_BSTR: A=V_BSTRT(&B); break;//COleVariant是一個字串
case VT_I2: A.Format(_T("%hd"),V_I2(&B));break;//是短整型
case VT_I4: A.Format(_T("%d"),V_I4(&B));break;//是長整型
case VT_R4: A.Format(_T("%e"),(double)V_R4(&B));break;//是浮點數
case VT_R8: A.Format(_T("%e"),V_R8(&B));break;//是浮點數
case VT_CY: A=COleCurrency(B).Format();break;//是貨幣值
case VT_DATE: A=COleDateTime(B).Format("%Y-%m-%d");break;//是日期
case VT_BOOL: A=V_BOOL(&B)?"True":"False";break;//是布爾值}
轉載于:https://www.cnblogs.com/yangxx-1990/p/4885236.html
總結
以上是生活随笔為你收集整理的MFC之COleVariant类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享一个简单程序(webApi+cast
- 下一篇: 浅谈动态规划