VARIANT类型

2011年12月14日 分类:学习笔记C++
VARIANT的定义如下:
typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;
typedef struct tagVARIANT 
{
   VARTYPE vt;
   unsigned short wReserved1;
   unsigned short wReserved2;
   unsigned short wReserved3;
   union
      {
          unsigned char bVal; // VT_UI1.
          short iVal; // VT_I2 .
          long lVal; // VT_I4 .
          float fltVal; // VT_R4 .
          double dblVal; // VT_R8 .
          VARIANT_BOOL boolVal; // VT_BOOL.
          SCODE scode; // VT_ERROR.
          CY cyVal; // VT_CY .
          DATE date; // VT_DATE.
          BSTR bstrVal; // VT_BSTR.
          IUnknown FAR* punkVal; // VT_UNKNOWN.
          IDispatch FAR* pdispVal; // VT_DISPATCH.
          SAFEARRAY FAR* parray; // VT_ARRAY|*.
          unsigned char FAR* pbVal; // VT_BYREF|VT_UI1.
          short FAR* piVal; // VT_BYREF|VT_I2.
          long FAR* plVal; // VT_BYREF|VT_I4.
          float FAR* pfltVal; // VT_BYREF|VT_R4.
          double FAR* pdblVal; // VT_BYREF|VT_R8.
          VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL.
          SCODE FAR* pscode; // VT_BYREF|VT_ERROR.
          CY FAR* pcyVal; // VT_BYREF|VT_CY.
          DATE FAR* pdate; // VT_BYREF|VT_DATE.
          BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR.
          IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN.
          IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH.
          SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*.
          VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT.
          void FAR* byref; // Generic ByRef.
       };
以下为OAIDL.h的定义:
typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;
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;
    } ;

作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2011/12/variant-type