字符串转换系列三:VARIANT、COleVariant 和_variant_t

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

大家好,又见面了,我是你们的朋友全栈君。



  在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应用程序中使用时需要在代码文件前面添加下列两句:

  #include “comutil.h”

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

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

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

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


相关推荐

  • java字符串分割split你用对了吗「建议收藏」

    java字符串分割split你用对了吗「建议收藏」一、split介绍split()方法根据匹配给定的正则表达式来拆分字符串。注意:.、$、|和*等转义字符,必须得加\\。注意:多个分隔符,可以用|作为连字符。语法publicString[]split(Stringregex,intlimit)参数 regex–正则表达式分隔符。 limit–分割的份数。 返回值字符串数组。二、测试一如下示例,猜猜答案吧privatestaticvoid…

    2022年9月28日
    2
  • python转置矩阵函数_对python 矩阵转置transpose的实例讲解

    python转置矩阵函数_对python 矩阵转置transpose的实例讲解在读图片时,会用到这么的一段代码:image_vector_len=np.prod(image_size)#总元素大小,3*55*47img=Image.open(path)arr_img=np.asarray(img,dtype=’float64′)arr_img=arr_img.transpose(2,0,1).reshape((image_vector_len,))#4…

    2022年5月5日
    48
  • Java的八种基本数据类型

    Java的八种基本数据类型1.byte:字节1.计算机中,数据传输大多是以“位”(bit,比特)为单位。2.一位就代表一个0或1(二进制),每8个位(bit)组成一个字节(byte),所以,1个字节=8位0101代码。2.short3.int4.long5.float6.double7.char1.char类型占2个字节(16位),用来表示字符。2.char是基本数据类型。String表示字符串,是类类型。一个String是由0~n个char组成。3.字符使用单引号表示,字符串使用双引号表示。8.boolea

    2022年7月7日
    20
  • unity3d的入门教程_unity菜鸟教程

    unity3d的入门教程_unity菜鸟教程Unity3D新手入门初级教程U3D是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。可发布游戏至Windows、Mac、Wii、iPhone、Windowsphone8和Android平台。也可以利用Unitywebplayer插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Macwidgets所支持!U3D现已经占领了国内85%的手游

    2022年9月19日
    2
  • RPN网络代码解读

    RPN网络代码解读1.说在前面的话在目标检测领域FasterRCNN可以说是无人不知无人不晓,它里面有一个网络结构RPN(RegionProposalNetwork)用于在特征图上产生候选预测区域。但是呢,这个网络结构具体是怎么工作的呢?网上有很多种解释,但是都是云里雾里的,还是直接撸代码来得直接,这里就直接从代码入手直接撸吧-_-||。首先,来看一下FasterRCNN中RPN的结构是什么样子的吧。…

    2022年6月23日
    26
  • 关于三极管的理解—根据IC符号简易迅速判断三极管导通情况

    关于三极管的理解—根据IC符号简易迅速判断三极管导通情况  很不幸,开始写博客的第一天就被师兄批评了。其实很对不起师兄,当年在大学学习模拟电路的时候我不太认真,那时候天天忙着和女朋友吃吃喝喝。。所以对于三极管的各种性质与基本运用场景缺乏较深的理解,仅仅只是知道导通、截止等几种判断方式而已。今天在设计电路时涉及到了运用三极管驱动光耦器件,以及通过三极管来驱动蜂鸣器等操作,在三极管的选材和设计上出现了低级的失误。检讨完毕后,翻出当年的模电书,配…

    2022年6月17日
    43

发表回复

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

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