com组件中的数据类型

2021-12-06 14:18:15 浏览数 (2)

_variant_t

封装VARIANT类型

代码语言:javascript复制
struct tagVARIANT {  
    union {  
        struct __tagVARIANT {  
            VARTYPE vt;  
            WORD    wReserved1;  
            WORD    wReserved2;  
            WORD    wReserved3;  
            union {  
                ULONGLONG     ullVal;       /* VT_UI8               */  
                LONGLONG      llVal;        /* VT_I8                */  
                LONG          lVal;         /* VT_I4                */  
                BYTE          bVal;         /* VT_UI1               */  
                SHORT         iVal;         /* VT_I2                */  
                FLOAT         fltVal;       /* VT_R4                */  
                DOUBLE        dblVal;       /* VT_R8                */  
                VARIANT_BOOL  boolVal;      /* VT_BOOL              */  
                _VARIANT_BOOL bool;         /* (obsolete)           */  
                SCODE         scode;        /* VT_ERROR             */  
                CY            cyVal;        /* VT_CY                */  
                DATE          date;         /* VT_DATE              */  
                BSTR          bstrVal;      /* VT_BSTR              */  
                IUnknown *    punkVal;      /* VT_UNKNOWN           */  
                IDispatch *   pdispVal;     /* VT_DISPATCH          */  
                SAFEARRAY *   parray;       /* VT_ARRAY             */  
                BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */  
                SHORT *       piVal;        /* VT_BYREF|VT_I2       */  
                LONG *        plVal;        /* VT_BYREF|VT_I4       */  
                LONGLONG *    pllVal;       /* VT_BYREF|VT_I8       */  
                FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */  
                DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */  
                VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */  
                _VARIANT_BOOL *pbool;       /* (obsolete)           */  
                SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */  
                CY *          pcyVal;       /* VT_BYREF|VT_CY       */  
                DATE *        pdate;        /* VT_BYREF|VT_DATE     */  
                BSTR *        pbstrVal;     /* VT_BYREF|VT_BSTR     */  
                IUnknown **   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */  
                IDispatch **  ppdispVal;    /* VT_BYREF|VT_DISPATCH */  
                SAFEARRAY **  pparray;      /* VT_BYREF|VT_ARRAY    */  
                VARIANT *     pvarVal;      /* VT_BYREF|VT_VARIANT  */  
                PVOID         byref;        /* Generic ByRef        */  
                CHAR          cVal;         /* VT_I1                */  
                USHORT        uiVal;        /* VT_UI2               */  
                ULONG         ulVal;        /* VT_UI4               */  
                INT           intVal;       /* VT_INT               */  
                UINT          uintVal;      /* VT_UINT              */  
                DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */  
                CHAR *        pcVal;        /* VT_BYREF|VT_I1       */  
                USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */  
                ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */  
                ULONGLONG *   pullVal;      /* VT_BYREF|VT_UI8      */  
                INT *         pintVal;      /* VT_BYREF|VT_INT      */  
                UINT *        puintVal;     /* VT_BYREF|VT_UINT     */  
                struct __tagBRECORD {  
                    PVOID         pvRecord;  
                    IRecordInfo * pRecInfo;  
                } __VARIANT_NAME_4;         /* VT_RECORD            */  
            } __VARIANT_NAME_3;  
        } __VARIANT_NAME_2;  
  
        DECIMAL decVal;  
    } __VARIANT_NAME_1;  
};  

VARIANT结构中vt表示类型,而_variant_t构造如下:

代码语言:javascript复制
_variant_t(const VARIANT& varSrc) throw(_com_error);
_variant_t(const VARIANT* pSrc) throw(_com_error);
_variant_t(const _variant_t& varSrc) throw(_com_error);
_variant_t(VARIANT& varSrc, bool fCopy) throw(_com_error); // Attach VARIANT if !fCopy
_variant_t(short sSrc, VARTYPE vtSrc = VT_I2) throw(_com_error); // Creates a VT_I2, or a VT_BOOL
_variant_t(long lSrc, VARTYPE vtSrc = VT_I4) throw(_com_error); // Creates a VT_I4, a VT_ERROR, or a VT_BOOL
_variant_t(float fltSrc) throw(); // Creates a VT_R4
...

可以转换long为_variant_t,但是没有int的转换函数,所以很多像ado函数不接受常量,需要强转long类型

代码语言:javascript复制
_RecordsetPtr record;
record->GetCollect((long)0);

_bstr_t

封装BSTR类型,通过构造转换类型,可以接收char*

0 人点赞