您的位置:首页 > 编程语言 > C语言/C++

C++ VARIANT数据类型操作详解

2016-05-05 17:55 387 查看
使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C++)实现的方法。

VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。

VARIANT 数据类型在文件OAIDL.IDL中定义如下:

[cpp] view
plain copy

struct tagVARIANT {

union {

struct __tagVARIANT {

VARTYPE vt;

WORD wReserved1;

WORD wReserved2;

WORD wReserved3;

union {

ULONGLONG ullVal; /* VT_UI8 */

LONGLONG llVal; /* VT_I8 */

LONG lVal; /* VT_I4 */

BYTE bVal; /* VT_UI1 */

SHORT iVal; /* VT_I2 */

FLOAT fltVal; /* VT_R4 */

DOUBLE dblVal; /* VT_R8 */

VARIANT_BOOL boolVal; /* VT_BOOL */

_VARIANT_BOOL bool; /* (obsolete) */

SCODE scode; /* VT_ERROR */

CY cyVal; /* VT_CY */

DATE date; /* VT_DATE */

BSTR bstrVal; /* VT_BSTR */

IUnknown * punkVal; /* VT_UNKNOWN */

IDispatch * pdispVal; /* VT_DISPATCH */

SAFEARRAY * parray; /* VT_ARRAY */

BYTE * pbVal; /* VT_BYREF|VT_UI1 */

SHORT * piVal; /* VT_BYREF|VT_I2 */

LONG * plVal; /* VT_BYREF|VT_I4 */

LONGLONG * pllVal; /* VT_BYREF|VT_I8 */

FLOAT * pfltVal; /* VT_BYREF|VT_R4 */

DOUBLE * pdblVal; /* VT_BYREF|VT_R8 */

VARIANT_BOOL *pboolVal; /* VT_BYREF|VT_BOOL */

_VARIANT_BOOL *pbool; /* (obsolete) */

SCODE * pscode; /* VT_BYREF|VT_ERROR */

CY * pcyVal; /* VT_BYREF|VT_CY */

DATE * pdate; /* VT_BYREF|VT_DATE */

BSTR * pbstrVal; /* VT_BYREF|VT_BSTR */

IUnknown ** ppunkVal; /* VT_BYREF|VT_UNKNOWN */

IDispatch ** ppdispVal; /* VT_BYREF|VT_DISPATCH */

SAFEARRAY ** pparray; /* VT_BYREF|VT_ARRAY */

VARIANT * pvarVal; /* VT_BYREF|VT_VARIANT */

PVOID byref; /* Generic ByRef */

CHAR cVal; /* VT_I1 */

USHORT uiVal; /* VT_UI2 */

ULONG ulVal; /* VT_UI4 */

INT intVal; /* VT_INT */

UINT uintVal; /* VT_UINT */

DECIMAL * pdecVal; /* VT_BYREF|VT_DECIMAL */

CHAR * pcVal; /* VT_BYREF|VT_I1 */

USHORT * puiVal; /* VT_BYREF|VT_UI2 */

ULONG * pulVal; /* VT_BYREF|VT_UI4 */

ULONGLONG * pullVal; /* VT_BYREF|VT_UI8 */

INT * pintVal; /* VT_BYREF|VT_INT */

UINT * puintVal; /* VT_BYREF|VT_UINT */

struct __tagBRECORD {

PVOID pvRecord;

IRecordInfo * pRecInfo;

} __VARIANT_NAME_4; /* VT_RECORD */

} __VARIANT_NAME_3;

} __VARIANT_NAME_2;

DECIMAL decVal;

} __VARIANT_NAME_1;

};

VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一行的注释形式给出。

使用VARIANT和VARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如下代码:

[cpp] view
plain copy

long lValue = 999;

VARIANT vParam;

vParam.vt = VT_I4;

vParam.lVal = lValue;

在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal。

使用char指针时 需要分配空间

VARIANT var;

char achValue[2048] = {0};

var.pcVal = achValue;

string strTest= var1.pcVal;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: