tagVARIANT结构

使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C++)实现的方法。
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。

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

[cpp]  view plain copy
  1. struct tagVARIANT {  
  2.     union {  
  3.         struct __tagVARIANT {  
  4.             VARTYPE vt;  
  5.             WORD    wReserved1;  
  6.             WORD    wReserved2;  
  7.             WORD    wReserved3;  
  8.             union {  
  9.                 ULONGLONG     ullVal;       /* VT_UI8               */  
  10.                 LONGLONG      llVal;        /* VT_I8                */  
  11.                 LONG          lVal;         /* VT_I4                */  
  12.                 BYTE          bVal;         /* VT_UI1               */  
  13.                 SHORT         iVal;         /* VT_I2                */  
  14.                 FLOAT         fltVal;       /* VT_R4                */  
  15.                 DOUBLE        dblVal;       /* VT_R8                */  
  16.                 VARIANT_BOOL  boolVal;      /* VT_BOOL              */  
  17.                 _VARIANT_BOOL bool;         /* (obsolete)           */  
  18.                 SCODE         scode;        /* VT_ERROR             */  
  19.                 CY            cyVal;        /* VT_CY                */  
  20.                 DATE          date;         /* VT_DATE              */  
  21.                 BSTR          bstrVal;      /* VT_BSTR              */  
  22.                 IUnknown *    punkVal;      /* VT_UNKNOWN           */  
  23.                 IDispatch *   pdispVal;     /* VT_DISPATCH          */  
  24.                 SAFEARRAY *   parray;       /* VT_ARRAY             */  
  25.                 BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */  
  26.                 SHORT *       piVal;        /* VT_BYREF|VT_I2       */  
  27.                 LONG *        plVal;        /* VT_BYREF|VT_I4       */  
  28.                 LONGLONG *    pllVal;       /* VT_BYREF|VT_I8       */  
  29.                 FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */  
  30.                 DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */  
  31.                 VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */  
  32.                 _VARIANT_BOOL *pbool;       /* (obsolete)           */  
  33.                 SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */  
  34.                 CY *          pcyVal;       /* VT_BYREF|VT_CY       */  
  35.                 DATE *        pdate;        /* VT_BYREF|VT_DATE     */  
  36.                 BSTR *        pbstrVal;     /* VT_BYREF|VT_BSTR     */  
  37.                 IUnknown **   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */  
  38.                 IDispatch **  ppdispVal;    /* VT_BYREF|VT_DISPATCH */  
  39.                 SAFEARRAY **  pparray;      /* VT_BYREF|VT_ARRAY    */  
  40.                 VARIANT *     pvarVal;      /* VT_BYREF|VT_VARIANT  */  
  41.                 PVOID         byref;        /* Generic ByRef        */  
  42.                 CHAR          cVal;         /* VT_I1                */  
  43.                 USHORT        uiVal;        /* VT_UI2               */  
  44.                 ULONG         ulVal;        /* VT_UI4               */  
  45.                 INT           intVal;       /* VT_INT               */  
  46.                 UINT          uintVal;      /* VT_UINT              */  
  47.                 DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */  
  48.                 CHAR *        pcVal;        /* VT_BYREF|VT_I1       */  
  49.                 USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */  
  50.                 ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */  
  51.                 ULONGLONG *   pullVal;      /* VT_BYREF|VT_UI8      */  
  52.                 INT *         pintVal;      /* VT_BYREF|VT_INT      */  
  53.                 UINT *        puintVal;     /* VT_BYREF|VT_UINT     */  
  54.                 struct __tagBRECORD {  
  55.                     PVOID         pvRecord;  
  56.                     IRecordInfo * pRecInfo;  
  57.                 } __VARIANT_NAME_4;         /* VT_RECORD            */  
  58.             } __VARIANT_NAME_3;  
  59.         } __VARIANT_NAME_2;  
  60.   
  61.         DECIMAL decVal;  
  62.     } __VARIANT_NAME_1;  
  63. };  
VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一行的注释形式给出。
使用VARIANT和VARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如下代码:

[cpp]  view plain copy
  1. long lValue = 999;  
  2. VARIANT vParam;  
  3. vParam.vt = VT_I4;  
  4. vParam.lVal = lValue;  

在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值