做传销网站违法,桂林阳朔2天游玩攻略,公司网站设计教程,wordpress 4.8漏洞2019独角兽企业重金招聘Python工程师标准 特殊 Variant 是一种特殊的数据类型#xff0c;除了定长String数据及用户定义类型外#xff0c;可以包含任何种类的数据。Variant 也可以包含Empty、Error、Nothing及Null等特殊值。可以用VarType函数或TypeName函数来… 2019独角兽企业重金招聘Python工程师标准 特殊 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则提升到 IntegerInteger 则提升到 Long而 Long和Single 则提升为 Double。当 Variant 变量中有 Currency、Decimal 及 Double 值超过它们各自的范围时会发生错误。 适应性 可以用 Variant 数据类型来替换任何数据类型这样会更有适应性。如果 Variant 变量的内容是数字它可以用字符串来表示数字或是用它实际的值来表示这将由上下文来决定例如 Dim MyVar As Variant MyVar 98052 在前面的例子中MyVar 内有一实际值为 98052 的数值。像期望的那样算术运算子可以对 Variant 变量运算其中包含数值或能被解释为数值的字符串数据。如果用 运算子来将 MyVar 与其他含有数字的 Variant 或数值类型的变量相加结果便是一算术和。 Empty 值用来标记尚未初始化给定初始值的Variant 变量。内含 Empty 的 Variant 在数值的上下文中表示 0如果是用在字符串的上下文中则表示零长度的字符串 ()。 不应将 Empty 与 Null 弄混。Null 是表示 Variant 变量确实含有一个无效数据。 在 Variant 中Error 是用来指示在过程中出现错误时的特殊值。然而不像对其他种类的错误那样程序并不产生普通的应用程序级的错误处理。这可以让程序员或应用程序本身根据此错误值采取另外的行动。可以用 CVErr 函数将实数转换为错误值来产生 Error 值。 变体类型Variant 变体类型Variant能够在运行期间动态的改变类型。变体类型能支持所有简单的数据类型如整型、浮点、字符串、布尔型、日期时间、货币及OLE自动化对象等不能够表达Object Pascal对象。 1.VarArrayCreate function 创建一个变体类型的数组。 function VarArrayCreate(const Bounds: array of Integer; VarType: TVarType): Variant; 创建并且填充一个一维的变体类型的数组。 function VarArrayOf(const Values: array of Variant): Variant; VarArrayCreate, VarArrayOf Example var A: Variant; begin A : VarArrayCreate([0, 4], varVariant); A[0] : 1; A[1] : 1234.5678; A[2] : Hello world; A[3] : True; A[4] : VarArrayOf([1, 10, 100, 1000]); WriteLn(A[2]); { Hello world } WriteLn(A[4][2]); { 100 } end; 2.VarArrayLock function 锁住一个变体类型的数组并且返回一个指向这个数据的指针。 function VarArrayLock(const A: Variant): Pointer; VarArrayLock, VarArrayUnlock Example type PArrayData ^TArrayData; TArrayData array[0..9, 1..3] of Integer; var A: Variant; P: PArrayData; I, J: Integer; begin A : VarArrayCreate([1, 3, 0, 9], varInteger); P : VarArrayLock(A); try for I : 0 to 9 do for J : 1 to 3 do P^[I, J] : J * 10 I; finally VarArrayUnlock(A); end; WriteLn(A[1, 9]); { 19 } WriteLn(A[3, 4]); { 34 } end; 3.VarArrayUnlock procedure Unlocks a variant array. procedure VarArrayUnlock(var A: Variant); VARIANT 数据类型在文件OAIDL.IDL中定义如下 struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { ULONGLONG ullVal; LONGLONG llVal; LONG lVal; BYTE bVal; SHORT iVal; FLOAT fltVal; DOUBLE dblVal; VARIANT_BOOL boolVal; _VARIANT_BOOL bool; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown * punkVal; IDispatch * pdispVal; SAFEARRAY * parray; BYTE * pbVal; SHORT * piVal; LONG * plVal; LONGLONG * pllVal; FLOAT * pfltVal; DOUBLE * pdblVal; VARIANT_BOOL *pboolVal; _VARIANT_BOOL *pbool; SCODE * pscode; CY * pcyVal; DATE * pdate; BSTR * pbstrVal; IUnknown ** ppunkVal; IDispatch ** ppdispVal; SAFEARRAY ** pparray; VARIANT * pvarVal; PVOID byref; CHAR cVal; USHORT uiVal; ULONG ulVal; INT intVal; UINT uintVal; DECIMAL * pdecVal; CHAR * pcVal; USHORT * puiVal; ULONG * pulVal; ULONGLONG * pullVal; INT * pintVal; UINT * puintVal; struct __tagBRECORD { PVOID pvRecord; IRecordInfo * pRecInfo; } __VARIANT_NAME_4; } __VARIANT_NAME_3; } __VARIANT_NAME_2; DECIMAL decVal; } __VARIANT_NAME_1; }; 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; 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_BLOB_OBJECT 70, VT_CF 71, VT_CLSID 72, VT_VERSIONED_STREAM 73, VT_BSTR_BLOB 0xfff, VT_VECTOR 0x1000, VT_ARRAY 0x2000, VT_BYREF 0x4000, VT_RESERVED 0x8000, VT_ILLEGAL 0xffff, VT_ILLEGALMASKED 0xfff, VT_TYPEMASK 0xfff } ; VARIANT支持的类型也就是vt成员的取值如表4-3所示。 表4-3 VARIANT支持的类型类型名含义VT_EMPTY指示未指定值VT_NULL指示空值类似于 SQL 中的空值VT_I2指示 short 整数VT_I4指示 long 整数VT_R4指示 float 值VT_R8指示 double 值VT_CY指示货币值VT_DATE指示 DATE 值VT_BSTR指示 BSTR 字符串VT_DISPATCH指示 IDispatch 指针VT_ERROR指示 SCODEVT_BOOL指示一个布尔值VT_VARIANT指示 VARIANTfar 指针VT_UNKNOWN指示 IUnknown 指针VT_DECIMAL指示 decimal 值VT_I1指示 char 值续表 类型名含义VT_UI1指示 byteVT_UI2指示 unsignedshortVT_UI4指示 unsignedlongVT_I8指示 64 位整数VT_UI8指示 64 位无符号整数VT_INT指示整数值VT_UINT指示 unsigned 整数值VT_VOID指示 C 样式 voidVT_HRESULT指示 HRESULTVT_PTR指示指针类型VT_SAFEARRAY指示 SAFEARRAYVT_CARRAY指示 C 样式数组VT_USERDEFINED指示用户定义的类型VT_LPSTR指示一个以 NULL 结尾的字符串VT_LPWSTR指示由 nullNothingnullptrnull引用在 Visual Basic 中为 Nothing 终止的宽字符串VT_RECORD指示用户定义的类型VT_FILETIME指示 FILETIME 值VT_BLOB指示以长度为前缀的字节VT_STREAM指示随后是流的名称VT_STORAGE指示随后是存储的名称VT_STREAMED_OBJECT指示流包含对象VT_STORED_OBJECT指示存储包含对象VT_BLOB_OBJECT指示 Blob 包含对象VT_CF指示剪贴板格式VT_CLSID指示类 IDVT_VECTOR指示简单的已计数数组VT_ARRAY指示 SAFEARRAY 指针VT_BYREF指示值为引 转载于:https://my.oschina.net/u/1469992/blog/275232