C++变体数据类型—— VARIANT.doc_第1页
C++变体数据类型—— VARIANT.doc_第2页
C++变体数据类型—— VARIANT.doc_第3页
C++变体数据类型—— VARIANT.doc_第4页
C++变体数据类型—— VARIANT.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+变体数据类型 VARIANT-zz: /zhangqc1985/article/details/47040382009-10-20 15:413601人阅读评论(0)收藏举报版权声明:本文为博主原创文章,未经博主允许不得转载。百度百科:Variant音标 Phonetic symbol词性及解释 Part of speech and definationn. 变体, 异体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 变量的内容是数字,它可以用字符串来表示数字或是用它实际的值来表示,这将由上下文来决定,例如:Dim MyVar As VariantMyVar = 98052在前面的例子中,MyVar 内有一实际值为 98052 的数值。像期望的那样,算术运算子可以对 Variant 变量运算,其中包含数值或能被解释为数值的字符串数据。如果用 + 运算子来将 MyVar 与其他含有数字的 Variant 或数值类型的变量相加,结果便是一算术和。Empty 值用来标记尚未初始化(给定初始值)的Variant 变量。内含 Empty 的 Variant 在数值的上下文中表示 0,如果是用在字符串的上下文中则表示零长度的字符串 ()。不应将 Empty 与 Null 弄混。Null 是表示 Variant 变量确实含有一个无效数据。在 Variant 中,Error 是用来指示在过程中出现错误时的特殊值。然而,不像对其他种类的错误那样,程序并不产生普通的应用程序级的错误处理。这可以让程序员,或应用程序本身,根据此错误值采取另外的行动。可以用 CVErr 函数将实数转换为错误值来产生 Error 值。变体类型Variant变体类型Variant,能够在运行期间动态的改变类型。变体类型能支持所有简单的数据类型,如整型、浮点、字符串、布尔型、日期时间、货币及OLE自动化对象等,不能够表达Object Pascal对象。VARIANT 数据类型在文件OAIDL.IDL中定义如下:1. structtagVARIANT2. union3. struct_tagVARIANT4. VARTYPEvt;5. WORDwReserved1;6. WORDwReserved2;7. WORDwReserved3;8. union9. 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_tagBRECORD55. 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数据结构要分两步完全。举一个例子,让我们考虑如下代码:long lValue = 999;VARIANT vParam;vParam.vt = VT_I4;vParam.lVal = lValue;在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal。使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C+)实现的方法。Invoke()方法的实现可以检查参数VARIANT封装的数值是否符合其正确的数据类型。如果符合,该类型将取出,并传递给调用方法。否则,Invoke()方法能够尝试使用 VariantChangeType()API函数来将该数值转换成正确的类型。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 Array* VT_EMPTY V P nothing* VT_NULL V P SQL style Null* VT_I2 VTPS 2 byte signed int* VT_I4 VTPS 4 byte signed int* VT_R4 VTPS 4 byte real* VT_R8 VTPS 8 byte real* VT_CY VTPS currency* VT_DATE VTPS date* VT_BSTR VTPS OLE Automation string* VT_DISPATCH VT S IDispatch * VT_ERROR VTPS SCODE* VT_BOOL VTPS True=-1, False=0* VT_VARIANT VTPS VARIANT * VT_UNKNOWN VT S IUnknown * VT_DECIMAL VT S 16 byte fixed point* VT_RECORD V PS user defined type* VT_I1 VTPs signed char* VT_UI1 VTPS unsigned char* VT_UI2 VTPS unsigned short* VT_UI4 VTPS unsigned long* VT_I8 TP signed 64-bit int* VT_UI8 TP unsigned 64-bit int* VT_INT VTPS signed machine int* VT_UINT VT S unsigned machine int* VT_INT_PTR T signed machine register size width* VT_UINT_PTR T unsigned machine register size width* VT_VOID T C style void* VT_HRESULT T Standard return type* VT_PTR T pointer type* VT_SAFEARRAY T (use VT_ARRAY in VARIANT)* VT_CARRAY T C style array* VT_USERDEFINED T user defined type* VT_LPSTR TP null terminated string* VT_LPWSTR TP wide null terminated string* VT_FILETIME P FILETIME* VT_BLOB P Length prefixed bytes* VT_STREAM P Name of the stream follows* VT_STORAGE P Name of the storage follows* VT_STREAMED_OBJECT P Stream contains an object* VT_STORED_OBJECT P Storage contains an object* VT_VERSIONED_STREAM P Stream with a GUID version* VT_BLOB_OBJECT P Blob contains an object* VT_CF P Clipboard format* VT_CLSID P A Class ID* VT_VECTOR P simple counted array* VT_ARRAY V SAFEARRAY* VT_BYREF V void* for local use* VT_BSTR_BLOB Reserved for system use*/enum VARENUM VT_EMPTY= 0,VT_NULL= 1,VT_I2= 2,VT_I4= 3,VT_R4= 4,VT_R8= 5,VT_CY= 6,VT_DATE= 7,VT_BSTR= 8,VT_DISPATCH= 9,VT_ERROR= 10,VT_BOOL= 11,VT_VARIANT= 12,VT_UNKNOWN= 13,VT_DECIMAL= 14,VT_I1= 16,VT_UI1= 17,VT_UI2= 18,VT_UI4= 19,VT_I8= 20,VT_UI8= 21,VT_INT= 22,VT_UINT= 23,VT_VOID= 24,VT_HRESULT= 25,VT_PTR= 26,VT_SAFEARRAY= 27,VT_CARRAY= 28,VT_USERDEFINED= 29,VT_LPSTR= 30,VT_LPWSTR= 31,VT_RECORD= 36,VT_INT_PTR= 37,VT_UINT_PTR= 38,VT_FILETIME= 64,VT_BLOB= 65,VT_STREAM= 66,VT_STORAGE= 67,VT_STREAMED_OBJECT= 68,VT_STORED_OBJECT= 69,VT_BL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论