《C++变体数据类型—— VARIANT》由会员分享,可在线阅读,更多相关《C++变体数据类型—— VARIANT(8页珍藏版)》请在金锄头文库上搜索。
1、C+变体数据类型VARIANT-zz: http:/ 15:41 3601人阅读 评论(0)收藏举报版权声明:本文为博主原创文章,未经博主允许不得转载。百度百科:Variant音标 Phonetic symbol 词性及解释 Part of speech and definationn. 变体, 异体a. 不同的, 有差别的【计】 变体型【化】 变体【医】 变异的; 变异体, 变型, 变种Variant 数据类型是所有没被显式声明(用如 Dim、Private、Public 或 Static 等语句) 为其他类型变量的数据类型。Variant数据类型并没有类型声明字符。Variant 是一种特
2、殊的数据类型,除了定长 String 数据及用户定义类型外,可以包含任 何种类的数据。Variant 也可以包含 Empty、Error、Nothing 及 Null 等特殊值。可以用 VarTvpe 函数或 TvpeName 函数来决定如何处理 Variant 中的数据。数值数据可以是任何整型或实型数,负数时范围从-1.797693134862315E308到-4.94066E-324,正数时则从 4.94066E-324 至I1.797693134862315E308。通常,数值Variant 数据保持为其Variant中原来的数据类型。例如,如果把一个Integer赋值给Variant,
3、则接 下来的运算会把此 Variant 当成 Integer 来处理。然而,如果算术运算针对含 Bvte、 Integer、 Long 或 Single 之一的 Variant 执行,并当结果超过原来数据类型的正常范围时,则在 Variant 中的结果会提升到较大的数据类型。如 Bvte 则提升到 Integer, Integer 则提升到 Long,而 Long 和 Single 则提升为 Double。当 Variant 变量中有 Currency、Decimal 及 Double 值超过它们各自的范围时,会发生错误。可以用 Variant 数据类型来替换任何数据类型,这样会更有适应性。如
4、果 Variant 变量 的内容是数字,它可以用字符串来表示数字或是用它实际的值来表示,这将由上下文来决定, 例如:Dim MyVar As VariantMyVar = 98052在前面的例子中,MyVar内有一实际值为98052的数值。像期望的那样,算术运算子 可以对Variant变量运算,其中包含数值或能被解释为数值的字符串数据。如果用+运算 子来将 MyVar 与其他含有数字的 Variant 或数值类型的变量相加,结果便是一算术和。Empty值用来标记尚未初始化(给定初始值)的Variant变量。内含Empty的Variant 在数值的上下文中表示 0,如果是用在字符串的上下文中则表
5、示零长度的字符串 ()。不应将 Empty 与 Null 弄混。 Null 是表示 Variant 变量确实含有一个无效数据。在 Variant 中, Error 是用来指示在过程中出现错误时的特殊值。然而,不像对其他种类的错误那样,程序并不产生普通的应用程序级的错误处理。这可以让程序员,或应用程序 本身,根据此错误值采取另外的行动。可以用 CVErr 函数将实数转换为错误值来产生 Error 值。变体类型 Variant变体类型Variant,能够在运行期间动态的改变类型。变体类型能支持所有简单的数据 类型,如整型、浮点、字符串、布尔型、日期时间、货币及OLE自动化对象等,不能够表 达 Ob
6、ject Pascal 对象。VARIANT数据类型在文件OAIDL.IDL中定义如下:1. struct tagVARIANT 2. union 3. struct _tagVARIANT 4.VARTYPEvt;5.WORDwReservedl;6.WORDwReserved2;7.WORDwReserved3;8.union 9.ULONGLONGullVal;/* VT_UI8*/10.LONGLONGllVal;/* VT_I8*/11.LONGlVal;/* VT_I4*/12.BYTEbVal;/* VT_UI1*/13.SHORTiVal;/* VT_I2*/14.FLOATf
7、ltVal;/* VT_R4*/15.DOUBLEdblVal;/* VT_R8*/16.VARIANT_BOOLboolVal;/* VT_BOOL*/17._VARIANT_BOOLbool;/* (obsolete)*/18.SCODEscode;/* VT_ERROR*/19.CYcyVal;/* VT_CY*/20.DATEdate;/* VT_DATE*/21.BSTRbstrVal;/* VT_BSTR*/22.IUnknown *punkVal;/* VT_UNKNOWN*/23.IDispatch *pdispVal;/* VT_DISPATCH*/24.SAFEARRAY
8、*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_BOO
9、L*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|V
10、T_ARRAY*/40.VARIANT *pvarVal;/* VT_BYREF|VT_VARIANT*/41.PVOIDbyref;/* Generic ByRef*/42.CHARcVal;/* VT_I1*/43.USHORTuiVal;/* VT_UI2*/44.ULONGulVal;/* VT_UI4*/45.INTintVal;/* VT_INT*/46.UINTuintVal;/* VT_UINT*/47.DECIMAL *pdecVal;/* VT_BYREF|VT_DECIMAL*/48.CHAR *pcVal;/* VT_BYREF|VT_I1*/49.USHORT *pu
11、iVal;/* 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.PVOIDpvRecord;56.IRecordInfo * pRecInfo;57. _VARIANT_NAME_4;/* VT_RECORD*/58. _VARIANT_NAME_3;59
12、. _VARIANT_NAME_2;60.60. DECIMAL decVal;61. _VARIANT_NAME_1;62. ;VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类 型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的 名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一 行的注释形式给出。使用VARIANT和VARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如 下代码:long lValue = 999;VARIANT vParam;vParam.vt = VT_I4;v
13、Param.lVal = lValue;在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据 类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域 使用的名称是 lVal。使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语 言(C+)实现的方法Invoke()方法的实现可以检查参数VARIANT封装的数值是否符合其正 确的数据类型。如果符合,该类型将取出,并传递给调用方法。否则,Invoke()方法能够尝 试使用VariantChangeType()API函数来将该数值转换成正确的
14、类型。typedef unsigned short VARTYPE;/* VARENUM usage key,* * V - may appear in a VARIANT* * T - may appear in a TYPEDESC* * P - may appear in an OLE property set* * S - may appear in a Safe ArrayVT_EMPTYV PnothingVT_NULLV PSQL style NullVT_I2VTPS2 byte signed intVT_I4VTPS4 byte signed intVT_R4VTPS4 byte real