VARIANT变体类型数据

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

特殊

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 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

指示 SCODE

VT_BOOL

指示一个布尔值

VT_VARIANT

指示 VARIANTfar 指针

VT_UNKNOWN

指示 IUnknown 指针

VT_DECIMAL

指示 decimal 值

VT_I1

指示 char 值

(续表)

类型名

含义

VT_UI1

指示 byte

VT_UI2

指示 unsignedshort

VT_UI4

指示 unsignedlong

VT_I8

指示 64 位整数

VT_UI8

指示 64 位无符号整数

VT_INT

指示整数值

VT_UINT

指示 unsigned 整数值

VT_VOID

指示 C 样式 void

VT_HRESULT

指示 HRESULT

VT_PTR

指示指针类型

VT_SAFEARRAY

指示 SAFEARRAY

VT_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

指示类 ID

VT_VECTOR

指示简单的已计数数组

VT_ARRAY

指示 SAFEARRAY 指针

VT_BYREF

指示值为引


转载于:https://my.oschina.net/u/1469992/blog/275232

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql修改校对集_MySQL 图文详细教程之校对集问题

软件安装:装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功…

C# winform 魔兽MH全图制作教程(1): 开发准备工作

C# winform 魔兽MH全图制作教程(1): 开发准备工作 一、开发条件: Visual Studio 2008win xp,win 7,win 2003.C# 语言基础会调试能够运行游戏:《魔兽争霸3冰封王座》拥有版本魔兽客户端版本切换器1.20E,1.24E,1.24D二、设计思路&am…

从常识看中国经济社会-再续之续:套利

2019独角兽企业重金招聘Python工程师标准>>> 《全球化掠夺》提及财富流转的路径,世界仍旧是个丛林,每个人、每个族群都在争夺自己的利益。在一个经济体的内部,财富是垂直流动的;在全球化的经济体中,财富是纵…

MYSQL中的BlackHole引擎

MYSQL中的BlackHole引擎 http://blog.csdn.net/ylspirit/article/details/7234021 http://blog.chinaunix.net/uid-22646981-id-3271711.html MySQL在5.x系列提供了Blackhole引擎–“黑洞”. 其作用正如其名字一样:任何写入到此引擎的数据均会被丢弃掉,…

《DIY四轴飞行器》读书笔记1

内容整理于黄和悦的《DIY四轴飞行器》。 一、四轴飞行器概述 1、四轴飞行器的现状 (1)研究内容 多级协作,自主飞行倾斜;最优控制理论,飞行器自主飞行和避障;主要是飞控部分。 (2&#xff09…

脚本输出当前 “yyyy-MM-dd WeakDay Festval”

ylbtech-JavaScript: 脚本输出当前 “yyyy-MM-dd WeakDay Festval”脚本输出当前 “yyyy-MM-dd WeakDay Festval” 1.A,源代码(Source Code)-脚本输出当前 “yyyy-MM-dd WeakDay Festval”返回顶部 <SCRIPT languagejavascript> <!--calendar new Date();day cal…

SecureCRT密钥远程登录Linux

一&#xff1a;环境SecureCRT版本&#xff1a;SecureCRT_5.1.3linux版本&#xff1a;[rootangelT ~]# cat /etc/redhat-release CentOS release 6.4 (Final)[rootangelT ~]# uname -r2.6.32-358.el6.x86_64linux系统的sshd_config配置文件是默认的&#xff0c;没有任何的修改。…

在Linux系统安装Nginx及配置https加密访问

2019独角兽企业重金招聘Python工程师标准>>> 1、安装nginx ①、为了确保能在 nginx 中使用正则表达式进行更灵活的配置&#xff0c;安装之前需要确定系统是否安装有 PCRE&#xff08;Perl Compatible Regular Expressions&#xff09;包。您可以到 ftp://ftp.csx.c…

和菜鸟一起学linux之bluez学习记录2

这里主要摘取对于hci&#xff0c;l2cap&#xff0c;sdp和rfcomm的一些应用编程。 关于hci 一、HCI层协议概述 1、HCI Command Packets 详见bluez源码&#xff1a;lib/hci.h /* Link Control */ #define OGF_LINK_CTL 0x01 #define OCF_INQUIRY 0x0001 #define OCF_…

AppDelegate.h

2019独角兽企业重金招聘Python工程师标准>>> #ifndef __APP_DELEGATE_H__ #define __APP_DELEGATE_H__#include "CCApplication.h" //CCApplication.h能根据平台打开对应的平台头文件 /** brief The cocos2d Application.The reason for implement as …

虚拟机上网以及互ping问题

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 虚拟机设置静态IP和上网问题 &#xff08;1&#xff09;在“虚拟机——设置——网络适配器”中选择桥接模式&#xff1b; &#xff08;2&#xff09;在“编辑——虚拟网络编辑器”中&#xff0c;选择桥接到有…

qt 飞扬青云_R语言学习——实例标识符

> patientID> age> diabetes> status> patientdata> #在上述创建的病例数据框中&#xff0c;病人编号(patientID)用于区分数据中的不同个体&#xff0c;在R中实例标识符(case identifier)可以通过数据框操作函数中的rowname选项指定&#xff0c;如下代码&…

fck java_FCkjava三种调用方法

测试FCK方法一:toolbarSet "Default" >默认内容测试方法二:FCKeditor oFCKeditor ;oFCKeditor new FCKeditor(request,"content") ;oFCKeditor.setBasePath( "/db/fckeditor/" ) ;oFCKeditor.setWidth("600");oFCKeditor.setHeig…

Spring 容器(Spring 的上下文)

为什么80%的码农都做不了架构师&#xff1f;>>> 最近在做项目时牵扯到有关父子上下文的概念。 何为父子上下文呢&#xff1f; 父上下文&#xff1a; 使用listener监听器来加载配置文件&#xff0c;如下&#xff1a; <listener> <listener-class>org.…

file_operations结构体

以下读书笔记内容摘自宋宝华《Linux设备驱动开发详解》一书。 file_operations结构体在字符设备驱动的地位 file_operations结构体的定义 此结构体定义在x210kernel/include/linux/fs.h文件中。 struct file_operations {struct module *owner;loff_t (*llseek) (struct file …

FlashCC学习札记

前段时间项目中有一个功能模块用到了FlashCC&#xff0c;将C的代码编译成swc文件&#xff0c;以便在Flash工程中使用。开发过程中遇到一些问题&#xff0c;现在记录下来&#xff0c;以便日后查阅。 一、开发环境搭建 说明:本文所使用的FlashCC版本为1.0.1&#xff0c; 操作系统…

”凉凉“ 的故事

某一天&#xff0c;我在给数据匹配编码的时候发现一个数据匹配不到编码&#xff0c;我怀疑是码表问题&#xff0c;终于发现一个非常奇妙的事情&#xff1a;两个一模一样的字符串竟然不相等&#xff1f;&#xff1f;&#xff1f; 屌爆了&#xff0c;我上下左右看遍了也没看出这2…

面向对象理论概述

2019独角兽企业重金招聘Python工程师标准>>> 转载自&#xff1a;http://my.oschina.net/brucelee80/blog 面向对象与面向过程的区别 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就…

网络设备驱动介绍

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、网络设备驱动概述 1、什么是网络设备 &#xff08;1&#xff09;网络设备&#xff1a;物理网卡在linux中形成的体系软件表现。 &#xff08;2&#xff09;物理网卡&#xff…

山东理工ACM【2561】九九乘法表

九九乘法表 Time Limit: 1000ms Memory limit: 65536K 有疑问&#xff1f;点这里^_^ 题目描述 九九乘法表是数学学习的基础&#xff0c;今天我们就来看看乘法表的相关问题。《九九乘法歌诀》&#xff0c;又常称为“小九九”,如下图所示。你的任务是写一个程序&#xff0c;对…