VARIANT、COleVariant 和_variant_t

VARIANT、COleVariant 和_variant_t 在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:structtagVARIANT{ VARTYPEvt; union{  shortiVal;//VT_I2.  longlVal;//VT

大家好,又见面了,我是你们的朋友全栈君。 在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:

struct tagVARIANT {

 VARTYPE vt;

 union {

  short iVal; // VT_I2.

  long lVal; // VT_I4.

  float fltVal; // VT_R4.

  double dblVal; // VT_R8.

  DATE date; // VT_DATE.

  BSTR bstrVal; // VT_BSTR.

  …

  short * piVal; // VT_BYREF|VT_I2.

  long * plVal; // VT_BYREF|VT_I4.

  float * pfltVal; // VT_BYREF|VT_R4.

  double * pdblVal; // VT_BYREF|VT_R8.

  DATE * pdate; // VT_BYREF|VT_DATE.

  BSTR * pbstrVal; // VT_BYREF|VT_BSTR.

 };

};

  显然,VARIANT类型是一个C结构,它包含了一个类型成员vt、一些保留字节以及一个大的union类型。例如,如果vt为VT_I2,那么我们可以从iVal中读出VARIANT的值。同样,当给一个VARIANT变量赋值时,也要先指明其类型。例如:

VARIANT va;

:: VariantInit(&va); // 初始化

int a = 2002;

va.vt = VT_I4; // 指明long数据类型

va.lVal = a; // 赋值

  为了方便处理VARIANT类型的变量,Windows还提供了这样一些非常有用的函数:

  VariantInit —— 将变量初始化为VT_EMPTY;

  VariantClear —— 消除并初始化VARIANT;

  VariantChangeType —— 改变VARIANT的类型;

  VariantCopy —— 释放与目标VARIANT相连的内存并复制源VARIANT。

   COleVariant类是对VARIANT结构的封装。它的构造函数具有极为强大大的功能,当对象构造时首先调用VariantInit进行初始化, 然后根据参数中的标准类型调用相应的构造函数,并使用VariantCopy进行转换赋值操作,当VARIANT对象不在有效范围时,它的析构函数就会被 自动调用,由于析构函数调用了VariantClear,因而相应的内存就会被自动清除。除此之外,COleVariant的赋值操作符在与 VARIANT类型转换中为我们提供极大的方便。例如下面的代码:

COleVariant v1(“This is a test”); // 直接构造

COleVariant v2 = “This is a test”;

// 结果是VT_BSTR类型,值为”This is a test”

COleVariant v3((long)2002);

COleVariant v4 = (long)2002;

// 结果是VT_I4类型,值为2002

  _variant_t是一个用于COM的VARIANT类,它的功能与COleVariant相似。不过在Visual C++.NET的MFC应用程序中使用时需要在代码文件前面添加下列两句:

  #i nclude “comutil.h”

  #pragma comment( lib, “comsupp.lib” )

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161070.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容

    WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容简介  在前面一篇文章里面,我们实现了AvalonDock选项卡的动态添加,但是对于选项卡里面的内容,我们并没有实现任何有用的功能。  这篇文章里面,我们将实现对选项卡里面的内容和功能实现自定义。将自定义Page作为选项卡内容Page定义  Page页面的Xaml代码如下:

    2022年7月20日
    80
  • python基础(4)元组[通俗易懂]

    python基础(4)元组[通俗易懂]元组元组的特点:是一种不可变序列,一旦创建就不能修改拆包将元组的元素取出赋值给不同变量>>>a=('hello','world',1

    2022年7月31日
    7
  • Ubuntu安装JDK教程

    Ubuntu安装JDK教程Ubuntu安装JDK教程jdk的下载和安装:1、打开浏览器,输入jdk的官网地址:https://www.oracle.com/java/technologies/javase-downloads.html,如图:2、找到需要下载的jdk版本,这里以1.8版为例,找到JavaSE8,点击JDKDownload,跳转到JavaSE8的下载页面,如图:3、找到对应的下载版本,我这里是Ubuntu64位的系统,需要找到linux64的jdk版本,点击进行下载,如图:4、下载成之后

    2022年7月12日
    19
  • Linux安装gcc方法(超简单安装)

    Linux安装gcc方法(超简单安装)Linux安装gcc方法(超简单安装)**1:Centos版本**终端输入以下命令yum-yinstallgccgcc-c++autoconfpcrepcre-develmakeautomakeyum-yinstallwgethttpd-toolsvim**2:Ubuntu版本**终端输入以下命令sudoaptinstallgcc输入Y开始安装获取版本信息,检查gcc是否安装成功了gcc–version出现版本信息代表安装完成*

    2022年5月25日
    262
  • idea2021.11激活[最新免费获取]

    (idea2021.11激活)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~6EK6WKOHUX-eyJsaWNlbnNlSWQiOi…

    2022年3月28日
    53
  • lqr算法优点(lqg控制)

    由来自INTERNAT的资料整理:LQR(linearquadraticregulator)即线性二次型调节器,其对象是现代控制理论中以状态空间形式给出的线性系统,而目标函数为对象状态和控制输入的二次型函数。LQR最优设计指设计是出的状态反馈控制器K要使二次型目标函数J取最小值,而K由权矩阵Q与R唯一决定,故此Q、R的选择尤为重要。LQR理论是现代控制理论中发展最早也最为成熟的…

    2022年4月15日
    88

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号