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 bs
trVal;
IUnknown FAR*
punkVal;
IDispatch FAR*
pdispVal;
SAFEARRAY FAR* pa
rray;
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结构的简化:

  1. struct VARIANT
  2. {
  3.     VARTYPE vt;                     //数据类型
  4.     union
  5.     {
  6.         LONG            lVal;       //VT_I4
  7.         VARIANT_BOOL    boolVal     //VT_BOOL
  8.         BSTR            bstrVal;    //VT_BSTR
  9.     }
  10. };

用法:

  1. VARIANT var;
  2. var.vt = VT_I4;     //指明整型数据
  3. var.lVal = 100;     //赋值

 

  1. 利用VARIANT表示一个布尔值:
  2. VARIANT var;
  3. var.vt = VT_BOOL;                   //指明整型数据
  4. var.boolVal = VARIANT_TRUE;     //赋值

 

  1. 利用VARIANT保存一个字符串:
  2. VARIANT var;
  3. var.vt = VT_BSTR;  
  4. var.bstrVal = SysAllocString(L"hello, world!");

 

从上面可以看出VARIANT这种类型使用起来比较复杂,其实有简单的办法,那就是采用VARIANT的封装类_variant_t。_variant_t的构造函数接受基本数据类型的数据作为参数,如下列出其中的一小部分:

  1. _variant_t(
  2.    short sSrc,
  3.     VARTYPE vtSrc = VT_I2
  4. );
  5. _variant_t(
  6.    long lSrc,
  7.     VARTYPE vtSrc = VT_I4
  8. );
  9. _variant_t(
  10.    float fltSrc
  11. ) throw( );
  12. _variant_t(
  13.    double dblSrc,
  14.     VARTYPE vtSrc = VT_R8
  15. );

另一方面,_variant_t提供了反向的转换函数,如将一个_variant_t转换成一个short数值,如下列出其中的一小部分:

  1. operator short( ) const;
  2. operator long( ) const;
  3. operator float( ) const;
  4. operator double( ) const;

因此可以看出,利用_variant_t可以很方便地实现VARIANT类型和基本数据类型之间的转换,如:

  1. long l = 123;
  2. _variant_t lVal(l);
  3. long m = lVal;

也可以用COleVariant和CComVariant来简化对VARIANT的操作,代码参考如下:

  1. COleVariant v3 = _T("hello, world!");
  2. COleVariant v4 = (long)1999;
  3. CString str = (BSTR)v3.pbstrVal;
  4. long i = v4.lVal;
posted @ 2011-12-26 16:40  stma  阅读(507)  评论(0)    收藏  举报