在 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 类型来存储数据。