首页 > 代码库 > 转:MFC之COleVariant

转:MFC之COleVariant

COleVariant 本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。

例子

[cpp] view plain copy
  1. COleVariant var(3.6f);  
  2. float v = var.fltVal;  
  3. CString str("testCOleVariant");  
  4. COleVariant var2(str);  
  5. CString cpStr(var2.bstrVal);  

 

例子

[cpp] view plain copy
  1. CString CMFCPropertyGridProperty::m_strFormatChar = _T("%c");  
  2. CString CMFCPropertyGridProperty::m_strFormatShort = _T("%d");  
  3. CString CMFCPropertyGridProperty::m_strFormatLong = _T("%ld");  
  4. CString CMFCPropertyGridProperty::m_strFormatUShort = _T("%u");  
  5. CString CMFCPropertyGridProperty::m_strFormatULong = _T("%u");  
  6. CString CMFCPropertyGridProperty::m_strFormatFloat = _T("%f");  
  7. CString CMFCPropertyGridProperty::m_strFormatDouble = _T("%lf");  
  8.   
  9. 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框架内容

[cpp] view plain copy
    1. class COleVariant : public tagVARIANT  
    2. {  
    3.     COleVariant(LPCTSTR lpszSrc);  
    4.     COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string  
    5.     COleVariant(CString& strSrc);  
    6.   
    7.     COleVariant(BYTE nSrc);  
    8.     COleVariant(short nSrc, VARTYPE vtSrc = VT_I2);  
    9.     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.   
    74. /*  
    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.         } ;  

转:MFC之COleVariant