您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > C++变体数据类型VARIANT
C++变体数据类型——VARIANT--zz::413601人阅读评论(0)收藏举报版权声明:本文为博主原创文章,未经博主允许不得转载。百度百科:Variant音标Phoneticsymbol[]词性及解释Partofspeechanddefinationn.变体,异体a.不同的,有差别的【计】变体型【化】变体【医】变异的;变异体,变型,变种Variant数据类型是所有没被显式声明(用如Dim、Private、Public或Static等语句)为其他类型变量的数据类型。Variant数据类型并没有类型声明字符。Variant是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。Variant也可以包含Empty、Error、Nothing及Null等特殊值。可以用VarType函数或TypeName函数来决定如何处理Variant中的数据。数值数据可以是任何整型或实型数,负数时范围从-1.797693134862315E308到-4.94066E-324,正数时则从4.94066E-324到1.797693134862315E308。通常,数值Variant数据保持为其Variant中原来的数据类型。例如,如果把一个Integer赋值给Variant,则接下来的运算会把此Variant当成Integer来处理。然而,如果算术运算针对含Byte、Integer、Long或Single之一的Variant执行,并当结果超过原来数据类型的正常范围时,则在Variant中的结果会提升到较大的数据类型。如Byte则提升到Integer,Integer则提升到Long,而Long和Single则提升为Double。当Variant变量中有Currency、Decimal及Double值超过它们各自的范围时,会发生错误。可以用Variant数据类型来替换任何数据类型,这样会更有适应性。如果Variant变量的内容是数字,它可以用字符串来表示数字或是用它实际的值来表示,这将由上下文来决定,例如:DimMyVarAsVariantMyVar=98052在前面的例子中,MyVar内有一实际值为98052的数值。像期望的那样,算术运算子可以对Variant变量运算,其中包含数值或能被解释为数值的字符串数据。如果用+运算子来将MyVar与其他含有数字的Variant或数值类型的变量相加,结果便是一算术和。Empty值用来标记尚未初始化(给定初始值)的Variant变量。内含Empty的Variant在数值的上下文中表示0,如果是用在字符串的上下文中则表示零长度的字符串()。不应将Empty与Null弄混。Null是表示Variant变量确实含有一个无效数据。在Variant中,Error是用来指示在过程中出现错误时的特殊值。然而,不像对其他种类的错误那样,程序并不产生普通的应用程序级的错误处理。这可以让程序员,或应用程序本身,根据此错误值采取另外的行动。可以用CVErr函数将实数转换为错误值来产生Error值。变体类型Variant变体类型Variant,能够在运行期间动态的改变类型。变体类型能支持所有简单的数据类型,如整型、浮点、字符串、布尔型、日期时间、货币及OLE自动化对象等,不能够表达ObjectPascal对象。VARIANT数据类型在文件OAIDL.IDL中定义如下:1.structtagVARIANT{2.union{3.struct__tagVARIANT{4.VARTYPEvt;5.WORDwReserved1;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.FLOATfltVal;/*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*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.PVOIDbyref;/*GenericByRef*/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*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.PVOIDpvRecord;56.IRecordInfo*pRecInfo;57.}__VARIANT_NAME_4;/*VT_RECORD*/58.}__VARIANT_NAME_3;59.}__VARIANT_NAME_2;60.61.DECIMALdecVal;62.}__VARIANT_NAME_1;63.};VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一行的注释形式给出。使用VARIANT和VARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如下代码:longlValue=999;VARIANTvParam;vParam.vt=VT_I4;vParam.lVal=lValue;在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal。使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C++)实现的方法。Invoke()方法的实现可以检查参数VARIANT封装的数值是否符合其正确的数据类型。如果符合,该类型将取出,并传递给调用方法。否则,Invoke()方法能够尝试使用VariantChangeType()API函数来将该数值转换成正确的类型。typedefunsignedshortVARTYPE;/**VARENUMusagekey,***[V]-mayappearinaVARIANT**[T]-mayappearinaTYPEDESC**[P]-mayappearinanOLEpropertyset**[S]-mayappearinaSafeArray***VT_EMPTY[V][P]nothing*VT_NULL[V][P]SQLstyleNull*VT_I2[V][T][P][S]2bytesignedint*VT_I4[V][T][P][S]4bytesignedint*VT_R4[V][T][P][S]4bytereal*VT_R8[V][T][P][S]8bytereal*VT_CY[V][T][P][S]currency*VT_DATE[V][T][P][S]date*VT_BSTR[V][T][P][S]OLEAutomationstring*VT_DISPATCH[V][T][S]IDispatch**VT_ERROR[V][T][P][S]SCODE*VT_BOOL[V][T][P][S]True=-1,False=0*VT_VARIANT[V][T][P][S]VARIANT**VT_UNKNOWN[V][T][S]IUnknown**VT_DECIMAL[V][T][S]16bytefixedpoint*VT_RECORD[V][P][S]userdefinedtype*VT_I1[V][T][P][s]signedchar*VT_UI1[V][T][P][S]unsignedchar*VT_UI2[V][T][P][S]unsignedshort*VT_UI4[V][T][P][S]unsignedlong*VT_I8[T][P]signed64-bitint*VT_UI8[T][P]unsigned64-bitint*VT_INT[V][T][P][S]signedmachineint*VT_UINT[V][T][S]unsignedmachineint*VT_INT_PTR[T]signedmachineregistersizewidth*VT_UINT_PTR[T]unsignedmachineregistersizewidth*VT_VOID[T]Cstylevoid*VT_HRESULT[T]Standardreturntype*VT_PTR[T]pointertype*VT_SAFEARRAY[T](useVT_ARRAYinVARIANT)*VT_CARRAY[T]Cstylearray*VT_USERDEFINED[T]userdefinedtype*VT_LPSTR[T][P]nullterminatedstring*VT_LPWSTR[T][P]widenullterminatedstring*VT_FILETIME[P]FILE
本文标题:C++变体数据类型VARIANT
链接地址:https://www.777doc.com/doc-2901605 .html