样将_variant_转化为vc中的数组

来源:互联网 发布:g41g42数控车编程方法 编辑:程序博客网 时间:2024/05/16 19:54
  VARIANT,变体类型,在VC 中是一个可以容纳很多常用类型的超级类型,所以,如果不知道它的里面到底存了些什么数据,对着它就像对着一个从未见过面的朋友一样,不知该怎么交流.在这种情况下,我们可以通过取得VARIANT类型变量的vt值,得以确认:
      enum VARENUM
    { VT_EMPTY = 0,
 VT_NULL = 1,
 VT_I2 = 2,
 VT_I4 = 3,
 VT_R4 = 4,
 VT_R8 = 5,
 VT_CY = 6,
 VT_DATE = 7,
 VT_BSTR = 8,
 VT_DISPATCH = 9,
 VT_ERROR = 10,
 VT_BOOL = 11,
 VT_VARIANT = 12,
 VT_UNKNOWN = 13,
 VT_DECIMAL = 14,
 VT_I1 = 16,
 VT_UI1 = 17,
 VT_UI2 = 18,
 VT_UI4 = 19,
 VT_I8 = 20,
 VT_UI8 = 21,
 VT_INT = 22,
 VT_UINT = 23,
 VT_VOID = 24,
 VT_HRESULT = 25,
 VT_PTR = 26,
 VT_SAFEARRAY = 27,
 VT_CARRAY = 28,
 VT_USERDEFINED = 29,
 VT_LPSTR = 30,
 VT_LPWSTR = 31,
 VT_RECORD = 36,
 VT_FILETIME = 64,
 VT_BLOB = 65,
 VT_STREAM = 66,
 VT_STORAGE = 67,
 VT_STREAMED_OBJECT = 68,
 VT_STORED_OBJECT = 69,
 VT_BLOB_OBJECT = 70,
 VT_CF = 71,
 VT_CLSID = 72,
 VT_BSTR_BLOB = 0xfff,
 VT_VECTOR = 0x1000,
 VT_ARRAY = 0x2000,
 VT_BYREF = 0x4000,
 VT_RESERVED = 0x8000,
 VT_ILLEGAL = 0xffff,
 VT_ILLEGALMASKED = 0xfff,
 VT_TYPEMASK = 0xfff
    };

    这个枚举结构里,存着vt值的宏定义,假如m_DataA为VARIANT类型变量,m_DataA .vt = 4,则这个变量里的就是存的一个单精度数据(以上宏在MSDN均可查到所代表的类型),当然,上面的宏可以叠加使用,比如说m_DataA.vt =  8204,转化成十六进制数为0x200C,VT_ARRAY = 0x2000,VT_VARIANT = 12(12的十六进制为:C),变量里存的数据是一个 变体数组类型(VT_ARRAY |VT_VARIANT ).

确定类型以后就可以直接读数了,比如:

variant  var; //假设这个变量中保存了数组元素
SAFEARRAY* psa = var.parray;
long count = psa->rgsabound->cElements; //判断元素个数
定义buf数组;
for (long i=0; i<count; i++)
{
  SafeArrayGetElement(psa,&i,&buf[i]); //buf为你定义的数组
}

你还可以根据 vt 域的不同来建立更通用的转换例程。为此你可能会考虑:

CString VariantToString(VARIANT * va)

{ CString s;

switch(va->vt)

{ /* vt */ case VT_BSTR:

return CString(vaData->bstrVal);

 case VT_BSTR | VT_BYREF:

return CString(*vaData->pbstrVal);

case VT_I4:

s.Format(_T(\"%d\"), va->lVal);

return s; case VT_I4 | VT_BYREF:

s.Format(_T(\"%d\"), *va->plVal);

case VT_R8:

s.Format(_T(\"%f\"), va->dblVal);

return s; ... 剩下的类型转换由读者自己完成

default: ASSERT(FALSE);

 // unknown VARIANT type (this ASSERT is optional) return CString(\"\"); } /* vt */}

原创粉丝点击