MFC之COleVariant[通俗易懂]

发布时间:2025-12-09 14:08:53 浏览次数:28

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

例子

COleVariant var(3.6f);float v = var.fltVal;CString str("testCOleVariant");COleVariant var2(str);CString cpStr(var2.bstrVal);

例子

CString CMFCPropertyGridProperty::m_strFormatChar = _T("%c");CString CMFCPropertyGridProperty::m_strFormatShort = _T("%d");CString CMFCPropertyGridProperty::m_strFormatLong = _T("%ld");CString CMFCPropertyGridProperty::m_strFormatUShort = _T("%u");CString CMFCPropertyGridProperty::m_strFormatULong = _T("%u");CString CMFCPropertyGridProperty::m_strFormatFloat = _T("%f");CString CMFCPropertyGridProperty::m_strFormatDouble = _T("%lf");CString CMFCPropertyGridProperty::FormatProperty(){ASSERT_VALID(this);ASSERT_VALID(m_pWndList);COleVariant& var = m_varValue;CString strVal;.............switch (var.vt){case VT_BSTR:strVal = var.bstrVal;break;case VT_I2:strVal.Format(m_strFormatShort, (short)var.iVal);break;case VT_I4:case VT_INT:strVal.Format(m_strFormatLong, (long)var.lVal);break;case VT_UI1:if ((BYTE)var.bVal != 0){strVal.Format(m_strFormatChar, (TCHAR)(BYTE)var.bVal);}break;case VT_UI2:strVal.Format( m_strFormatUShort, var.uiVal);break;case VT_UINT:case VT_UI4:strVal.Format(m_strFormatULong, var.ulVal);break;case VT_R4:strVal.Format(m_strFormatFloat, (float)var.fltVal);break;case VT_R8:strVal.Format(m_strFormatDouble, (double)var.dblVal);break;case VT_BOOL:strVal = var.boolVal == VARIANT_TRUE ? m_pWndList->m_strTrue : m_pWndList->m_strFalse;break;default:// Unsupported typestrVal = _T("*** error ***");}return strVal;}

COleVariant框架内容

class COleVariant : public tagVARIANT{COleVariant(LPCTSTR lpszSrc);COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI stringCOleVariant(CString& strSrc);COleVariant(BYTE nSrc);COleVariant(short nSrc, VARTYPE vtSrc = VT_I2);COleVariant(long lSrc, VARTYPE vtSrc = VT_I4);COleVariant(const COleCurrency& curSrc);COleVariant(float fltSrc);COleVariant(double dblSrc);COleVariant(const COleDateTime& timeSrc);....................................const COleVariant& operator=(float fltSrc);const COleVariant& operator=(double dblSrc);const COleVariant& operator=(const COleDateTime& dateSrc);const COleVariant& operator=(const CByteArray& arrSrc);const COleVariant& operator=(const CLongBinary& lbSrc);};void Clear();void ChangeType(VARTYPE vartype, LPVARIANT pSrc = NULL);void Attach(VARIANT& varSrc);VARIANT Detach();   void GetByteArrayFromVariantArray(CByteArray& bytes);void SetString(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set ANSI stringoperator LPVARIANT();operator LPCVARIANT() const/struct tagVARIANT    {    union         {        struct __tagVARIANT            {VARTYPE vt;.......................            union                 {                LONGLONG llVal;                LONG lVal;                BYTE bVal;                SHORT iVal;                FLOAT fltVal;                DOUBLE dblVal;                ...........                DATE date;                BSTR bstrVal;                IUnknown *punkVal; IDispatch *pdispVal;..............}COleVariant::COleVariant(float fltSrc){ vt = VT_R4; fltVal = fltSrc; }_AFXDISP_INLINE COleVariant::COleVariant(CString& strSrc){ vt = VT_EMPTY; *this = strSrc; }const COleVariant& COleVariant::operator=(const CString& strSrc){// Free up previous VARIANTClear();vt = VT_BSTR;bstrVal = strSrc.AllocSysString();return *this;}typedef unsigned short VARTYPE;/* * VARENUM usage key, * * * [V] - may appear in a VARIANT * * [T] - may appear in a TYPEDESC * * [P] - may appear in an OLE property set * * [S] - may appear in a Safe Array * * *  VT_EMPTY            [V]   [P]     nothing *  VT_NULL             [V]   [P]     SQL style Null *  VT_I2               [V][T][P][S]  2 byte signed int *  VT_I4               [V][T][P][S]  4 byte signed int *  VT_R4               [V][T][P][S]  4 byte real *  VT_R8               [V][T][P][S]  8 byte real *  VT_CY               [V][T][P][S]  currency *  VT_DATE             [V][T][P][S]  date *  VT_BSTR             [V][T][P][S]  OLE Automation string *  VT_DISPATCH         [V][T]   [S]  IDispatch * *  VT_ERROR            [V][T][P][S]  SCODE *  VT_BOOL             [V][T][P][S]  True=-1, False=0 *  VT_VARIANT          [V][T][P][S]  VARIANT * *  VT_UNKNOWN          [V][T]   [S]  IUnknown * *  VT_DECIMAL          [V][T]   [S]  16 byte fixed point .......................................enum VARENUM    {VT_EMPTY= 0,VT_NULL= 1,VT_I2= 2,VT_I4= 3,VT_R4= 4,VT_R8= 5,VT_CY= 6,VT_DATE= 7,VT_BSTR= 8,.........................................    } ;
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477