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_ERROR传DISP_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 | 指定一个表示日期和时间的值。日期是通过双精度数表示的,例如 1月1日,1900是 2.0,那么1月2日,1900就是3.0,以此类推。日期值存放在date中 这种编号系统和很多电子表格程序中使用的是一致的,尽管有些人错误地指定了2月29,1900存在,并且因此将1月1,1900设置为1.0。这个日期可以通过VariantTimeToDosDateTime在MS-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 |