2010.7.15 variant ,COleVariant,_variant_t

一、variant ,COleVariant,_variant_t三者的关于、区别、转换

 1、variant

    variant是C的一个结构体

    VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。

    换句话说,当你要处理不同类型的数据时,不可能提起知道到底要传输的是什么类型的数据,那么都可以用variant 封装起来,到用的时候,再判断类型.

    看variant的定义,在OAIDl.h文件中,

    typedef  struct  tagVARIANT  VARIANT;

    而tagVARIANT又是一个结构体:

    struct tagVARIANT
    {
    union
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    }  __VARIANT_NAME_4;
                }  __VARIANT_NAME_3;
            }  __VARIANT_NAME_2;
        DECIMAL decVal;
        }  __VARIANT_NAME_1;
    } ;

        实际的应用,比如在项目中,我使用CMFCPropertyGridProperty展示数据,当我想获得一个Property的数据时,我是不知道将会得到什么样的数据的,int型?float型?char型?等等

       那么我可以用VARIANT封装得到的数据,实际上CMFCPropertyGridProperty也是这么返回的,看CMFCPropertyGridProperty->GetValue(),

       MSDN:

       virtual const _variant_t& GetValue() const;

      返回的就是一个_variant_t的东东。

      那么_variant_t是什么呢?

2、_variant_t

    _variant_t是一个用于COM的VARIANT类,看声明:(在comutil.h文件中)

    

class _variant_t : public ::tagVARIANT {
public:
    // Constructors
    //
    _variant_t() throw();

    _variant_t(const VARIANT& varSrc) ;
    _variant_t(const VARIANT* pSrc) ;
    _variant_t(const _variant_t& varSrc) ;

    ....

    太长了,就不列了。

    _variant_t很明显是对VARIANT的封装。

3、COleVariant

    COleVariant类也是对VARIANT结构的封装,看声明:(在afxdisp.h文件中)

   

class COleVariant : public tagVARIANT
{
// Constructors
public:
 COleVariant();

 COleVariant(const VARIANT& varSrc);
 COleVariant(LPCVARIANT pSrc);
 COleVariant(const COleVariant& varSrc);

 ...太长了,不列了

    

4、那么COleVariant与_variant_t,这两者有什么区别呢?什么时候使用哪个呢?

 

你可能感兴趣的:(ant)