在 Windows 中,VARIANT 是一种通用数据类型,用于处理各种不同的数据类型。VARIANT 中的 vt 成员变量指示 VARIANT 存储的数据类型。

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 __OBSOLETE__VARIANT_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 *__OBSOLETE__VARIANT_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;
    } ;

  

以下是一些常用的 vt 类型及其说明:

  • VT_EMPTY:空的 VARIANT 对象。
  • VT_NULL:NULL 值。
  • VT_I2:16 位有符号整数。成员变量为 iVal。
  • VT_I4:32 位有符号整数。成员变量为 lVal。
  • VT_R4:单精度浮点数。成员变量为 fltVal。
  • VT_R8:双精度浮点数。成员变量为 dblVal。
  • VT_CY:货币类型,使用一个 64 位整数表示。成员变量为 cyVal。
  • VT_DATE:日期类型,使用一个双精度浮点数表示。成员变量为 date。
  • VT_BSTR:Unicode 字符串。成员变量为 bstrVal。
  • VT_DISPATCH:指向 IDispatch 接口的指针。成员变量为 pdispVal。
  • VT_ERROR:HRESULT 错误代码。成员变量为 scode。
  • VT_BOOL:布尔值。成员变量为 boolVal。
  • VT_VARIANT:另一个 VARIANT 对象的指针。成员变量为 pvarVal。
  • VT_UNKNOWN:指向 IUnknown 接口的指针。成员变量为 punkVal。
  • VT_DECIMAL:使用一个 DECIMAL 结构体表示的精度数值。成员变量为 decVal。
  • VT_I1:8 位有符号整数。成员变量为 cVal。
  • VT_UI1:8 位无符号整数。成员变量为 bVal。
  • VT_UI2:16 位无符号整数。成员变量为 uiVal。
  • VT_UI4:32 位无符号整数。成员变量为 ulVal。
  • VT_INT:机器字长整数。成员变量为 intVal。
  • VT_UINT:机器字长无符号整数。成员变量为 uintVal。
  • VT_ARRAY:数组类型。成员变量为 parray。
  • VT_BYREF:指针类型。成员变量为 byref。

除了上述常用的 vt 类型之外,还有一些其他的 vt 类型,如 VT_RECORD(自定义记录类型)和 VT_USERDEFINED(用户定义类型)。需要根据实际情况选择合适的 vt 类型来存储数据。