VARIANT and VARIANTARG Data Types [Automation]

 

原始地址:http://msdn.microsoft.com/en-us/library/ms221627.aspx#footerLink

使用VARIANT类型来表示DISPPARAMS内部传递的参数, 同时VARIANT可以订制那些不能引用传参的变量类型。当一个变量A通过VT_VARIANT | VT_BYREF 类型被另外一个变量B引用时,被引用A就不能是VT_VARIANT | VT_BYREF类型。VARIANT类型能作为值传递,VARIANTARG也不能。下面是OAIDL.h文件里面对VARIANT的描述:

struct tagVARIANT

{

  union

    {

    struct __tagVARIANT

       {

       VARTYPE vt;

       WORD wReserved1;

       WORD wReserved2;

       WORD wReserved3;

       union

          {

           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;

           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;

           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

           ULONGLONG           ullVal;          // VT_UI8

           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;

           }    __VARIANT_NAME_3;

       }    __VARIANT_NAME_2;

       DECIMAL decVal;

    }   __VARIANT_NAME_1;

};

 

为了能简单得从VARIANTARG中提取出值,Automation提供了一系列有关这个类型的操作(参看Conversion and Manipulation Functions [Automation] Formatting Routines [Automation])。为保证应用程序能采用一致的强规则,我们强烈建议使用这些操作。

vt 这个表示了VARIANT这个类型的含义:

解释

VT_EMPTY

未指定vt值。如果一个Automation方法的可选参数需要为空,那么不要给VARAINT的类型传VT_EMPTY,取而代之的是要给VT_ERRORDISP_E_PARAMNOTFOUND

VT_EMPTY | VT_BYREF

N/A

VT_UI1

表示bVal里面存放一个无符号单字节字符值

VT_UI1 | VT_BYREF

表示无符号单字节字符值的引用,这个值的指针存放在pbVal

VT_UI2

表示uiVal里存放了一个无符号双字节整形值

VT_UI2 | VT_BYREF

表示无符号双字节整形值的引用,这个值的指针存放在puiVal

VT_UI4

表示ulVal里面存放了一个无符号四字节整形值

VT_UI4 | VT_BYREF

表示无符号四字节整形值的引用,这个值的指针存放在pulVal

VT_UI8

表示ullVal里面存放了一个无符号八字节整形值

VT_UI8这个类型在Windows ME 及更早版本,Windows 2000及更早版本中无效

VT_UI8 | VT_BYREF

表示无符号八字节整形值的引用,这个值的指针存放在pullVal

VT_UINT

表示uintVal里面存放了一个无符号整形值

VT_UINT | VT_BYREF

表示无符号整形值的引用,这个值的指针存放在puintVal

VT_INT

表示intVal里面存放了一个整形值

VT_INT | VT_BYREF

表示整形值的引用,这个值的指针存放在pintVal

VT_I1

表示cVal里面存放了一个单字节字符值

VT_I1 | VT_BYREF

表示单字节字符值的引用,这个值的指针存放在pcVal

VT_I2

表示iVal里面存放了一个双字节整形值

VT_I2 | VT_BYREF

表示双字节整形值的引用,这个值的指针存放在piVal

VT_I4

表示lVal里面存放了一个四字节字符值

VT_I4 | VT_BYREF

表示四字节字符值的引用,这个值的指针存放在plVal

VT_I8

表示llVal里面存放了一个单字节字符值

VT_I8这个类型在Windows ME 及更早版本,Windows 2000及更早版本中无效

VT_I8 | VT_BYREF

表示单字节字符值的引用,这个值的指针存放在pllVal

VT_R4

表示fltVal里面存放了一个IEEE四字节真值

VT_R4 | VT_BYREF

表示IEEE四字节真值的引用,这个值的指针存放在pfltlVal

VT_R8

表示dbVal里面存放了一个IEEE八字节真值

VT_R8 | VT_BYREF

表示IEEE八字节真值的引用,这个值的指针存放在pdblVal

VT_CY

指定一个货币值。货币值是64位(8字节),补码 通过10,000 整除后给出一个定点数小数点,左边15位,右边4位。这个值存放在cyVal

VT_CY | VT_BYREF

表示货币值的引用。这个值的指针放存放在pcyVal

VT_BSTR

bstrVal中存放string值,这个指针必须是通过BSTR的函数获得或者释放的,详细参看Conversion and Manipulation Functions.

VT_BSTR | VT_BYREF

表示string值的引用,pbstrVal中存放了BSTR*。这个引用的指针值必须通过BSTR的函数获得或者释放

VT_DECIMAL

十进制数,存放为96位(12字节)无符号整形。能被10的次方除。

VT_DECIMAL | VT_BYREF

表示一个十进制数的引用。这个值的指针存放在pdecVal

VT_NULL

指定了一个null(需要和null指针区分开) ,这个null值是在三态逻辑中使用,例如SQL中的null

VT_NULL | VT_BYREF

N/A

VT_ERROR

指定一个存放在scodee中的SCODE值,一般情况下,比较恰当的错误值的操作是需要抛出异常或者在把错误值在返回值中体现。

VT_ERROR | VT_BYREF

SCODE值得引用,存放在pscode

VT_BOOL

指定一个16位布尔型(True/False) 0xFFFF表示真,0x0000表示假,不存在其他值

VT_BOOL | VT_BYREF

布尔类型的引用,存放在pbool

VT_DATE

指定一个表示日期和时间的值。日期是通过双精度数表示的,例如 11日,1900 2.0,那么12日,1900就是3.0,以此类推。日期值存放在date

这种编号系统和很多电子表格程序中使用的是一致的,尽管有些人错误地指定了2291900存在,并且因此将111900设置为1.0。这个日期可以通过VariantTimeToDosDateTimeMS-DOS表示法之间相互转化。细节参看Conversion and Manipulation Functions.

VT_DATE | VT_BYREF

日期类型的引用,指针存放在pdate中。

VT_DISPATCH

指定了一个指向对象的指针类型,值存放在pdispVal中。这个对象就是特制IDispatch接口实现的对象。这个对象能通过调用QueryInterface进行访问,不管它是否实现了其他需要的接口。那些没有实现IDispatch接口的对象,就需要把它传给VT_UNKNOWN

VT_DISPATCH | VT_BYREF

对象指针的指针,它存放在这个指针的指针中 ppdispVal

VT_VARIANT

非法。VARIANTARG必须通过引用传递。

VT_VARIANT | VT_BYREF

pvalVal中存放了另外一个VARIANTTARG的指针。这个被引用的VARIANTARG不能是VT_VARIANT | VT_BYREF类型。

VT_UNKNOWN

指定一个存放在punkVal中的IUnknown实现对象的指针

VT_UNKNOWN | VT_BYREF

指定一个存放在ppunkVal中的指向IUnknown实现对象指针的指针。

VT_ARRAY | <anything>

指定一个<anything>类型的数组。(VT_EMPTY VT_NULL不能和VT_ARRAY 类型组合)。parray中的指针指向了数组描述器,这个描述器提供了维度,大小,和数组内存位置信息。它不能直接被访问,但是能被读取和使用,详细参看Conversion and Manipulation Functions

 

 

posted on 2011-02-10 08:04  caucyj  阅读(2001)  评论(0编辑  收藏  举报