variant结构
VARIANT支持的类型
类型名
含义
VT_EMPTY
指示未指定值
VT_NULL
指示空值(类似于 SQL 中的空值)
VT_I2
指示 short 整数
VT_I4
指示 long 整数
VT_R4
指示 float 值
VT_R8
指示 double 值
VT_CY
指示货币值
VT_DATE
指示 DATE 值
VT_BSTR
指示 BSTR 字符串
VT_DISPATCH
指示 IDispatch 指针
VT_ERROR
指示 SCODE
VT_BOOL
指示一个布尔值
VT_VARIANT
指示 VARIANTfar 指针
VT_UNKNOWN
指示 IUnknown 指针
VT_DECIMAL
指示 decimal 值
VT_I1
指示 char 值
类型名
含义
VT_UI1
指示 byte
VT_UI2
指示 unsignedshort
VT_UI4
指示 unsignedlong
VT_I8
指示 64 位整数
VT_UI8
指示 64 位无符号整数
VT_INT
指示整数值
VT_UINT
指示 unsigned 整数值
VT_VOID
指示 C 样式 void
VT_HRESULT
指示 HRESULT
VT_PTR
指示指针类型
VT_SAFEARRAY
指示 SAFEARRAY
VT_CARRAY
指示 C 样式数组
VT_USERDEFINED
指示用户定义的类型
VT_LPSTR
指示一个以 NULL 结尾的字符串
VT_LPWSTR
指示由 nullNothingnullptrnull
引用(在 Visual Basic
中为 Nothing) 终止的宽字符串
VT_RECORD
指示用户定义的类型
VT_FILETIME
指示 FILETIME 值
VT_BLOB
指示以长度为前缀的字节
VT_STREAM
指示随后是流的名称
VT_STORAGE
指示随后是存储的名称
VT_STREAMED_OBJECT
指示流包含对象
VT_STORED_OBJECT
指示存储包含对象
VT_BLOB_OBJECT
指示 Blob 包含对象
VT_CF
指示剪贴板格式
VT_CLSID
指示类 ID
VT_VECTOR
指示简单的已计数数组
VT_ARRAY
指示 SAFEARRAY 指针
VT_BYREF
指示值为引用
VARIANT结构:
typedef struct tagVARIANT {
VARTYPE vt;
unsigned short wReserved1;
unsigned short wReserved2;
unsigned short wReserved3;
union {
unsigned char bVal;
short iVal;
long lVal;
float fltVal;.
double dblVal;
VARIANT_BOOL boolVal;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown FAR* punkVal;
IDispatch FAR* pdispVal;
SAFEARRAY FAR* parray;
unsigned char FAR* pbVal;
short FAR* piVal;
long FAR* plVal;
float FAR* pfltVal;
double FAR* pdblVal;
VARIANT_BOOL FAR* pboolVal;
SCODE FAR* pscode;
CY FAR* pcyVal;
DATE FAR* pdate;
BSTR FAR* pbstrVal;
IUnknown FAR* FAR* ppunkVal;
IDispatch FAR* FAR* ppdispVal;
SAFEARRAY FAR* FAR* pparray;
VARIANT FAR* pvarVal;
void FAR* byref;
};
};
typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;
VARIANT结构的简化:
- struct VARIANT
- {
- VARTYPE vt; //数据类型
- union
- {
- LONG lVal; //VT_I4
- VARIANT_BOOL boolVal //VT_BOOL
- BSTR bstrVal; //VT_BSTR
- }
- };
用法:
- VARIANT var;
- var.vt = VT_I4; //指明整型数据
- var.lVal = 100; //赋值
- 利用VARIANT表示一个布尔值:
- VARIANT var;
- var.vt = VT_BOOL; //指明整型数据
- var.boolVal = VARIANT_TRUE; //赋值
- 利用VARIANT保存一个字符串:
- VARIANT var;
- var.vt = VT_BSTR;
- var.bstrVal = SysAllocString(L"hello, world!");
从上面可以看出VARIANT这种类型使用起来比较复杂,其实有简单的办法,那就是采用VARIANT的封装类_variant_t。_variant_t的构造函数接受基本数据类型的数据作为参数,如下列出其中的一小部分:
- _variant_t(
- short sSrc,
- VARTYPE vtSrc = VT_I2
- );
- _variant_t(
- long lSrc,
- VARTYPE vtSrc = VT_I4
- );
- _variant_t(
- float fltSrc
- ) throw( );
- _variant_t(
- double dblSrc,
- VARTYPE vtSrc = VT_R8
- );
另一方面,_variant_t提供了反向的转换函数,如将一个_variant_t转换成一个short数值,如下列出其中的一小部分:
- operator short( ) const;
- operator long( ) const;
- operator float( ) const;
- operator double( ) const;
因此可以看出,利用_variant_t可以很方便地实现VARIANT类型和基本数据类型之间的转换,如:
- long l = 123;
- _variant_t lVal(l);
- long m = lVal;
也可以用COleVariant和CComVariant来简化对VARIANT的操作,代码参考如下:
- COleVariant v3 = _T("hello, world!");
- COleVariant v4 = (long)1999;
- CString str = (BSTR)v3.pbstrVal;
- long i = v4.lVal;