VC—-各种数据类型VARIANT、COleVariant 、_variant_t

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

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

VARIANT、COleVariant 和_variant_t

在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/161082.html原文链接:https://javaforall.net

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


相关推荐

  • 新东方王强经典语录视频_新东方王强北大演讲视频

    新东方王强经典语录视频_新东方王强北大演讲视频王强老师是我最喜欢和尊敬的新东方老师之一,06年冬天,有幸王强老师到我所在的大学做演讲。其实,之前也看过很多王强老师演讲的视频,特摘录王强老师经典十条语录。王强老师语录一:中国人强调含蓄,我含一半,你蓄一半,剩下的就是我要表达的。我举个例子就知道了。比如说一首英文歌曲唱ILoveYou的。这抽象概念,英语表达得非常充满细节和逻辑,你不会觉得有歧义和想象…

    2022年9月13日
    0
  • GATK流程_diskeeper怎么用

    GATK流程_diskeeper怎么用一、使用GATK前须知事项:(1)对GATK的测试主要使用的是人类全基因组和外显子组的测序数据,而且全部是基于illumina数据格式,目前还没有提供其他格式文件(如IonTorrent)或者实验设计(RNA-Seq)的分析方法。(2)GATK是一个应用于前沿科学研究的软件,不断在更新和修正,因此,在使用GATK进行变异检测时,最好是下载最新的版本,目前的版本是2.8.1(2014-02

    2022年10月21日
    0
  • 代理服务器与反向代理服务器的区别「建议收藏」

    代理服务器与反向代理服务器的区别「建议收藏」代理服务器与反向代理服务器

    2022年5月6日
    40
  • MySQL数据库备份的几种方式

    MySQL数据库备份的几种方式MySQL备份的几种方式最近一直想写点博客,但是不知道写什么,感觉自己最近的知识没有什么增加,今天想到了一篇可以写的博客。以前试过根据data文件夹备份MySQL,但是从来没有成功过,前几天帮助朋友还原MySQL,终于成功的将备份的data文件夹还原成功了。MySQL数据库算是常用的数据库中最好使用的数据库了,对于备份的操作也不例外。所以今天分享一下MySQL数据库的备份的几种方式。方

    2022年6月11日
    31
  • idea 设置导入包不带*

    idea 设置导入包不带*

    2021年5月16日
    202
  • 微表情识别

    表情识别2019.12更新了仓库依赖。简介使用卷积神经网络构建整个系统,在尝试了Gabor、LBP等传统人脸特征提取方式基础上,深度模型效果显著。在FER2013、JAFFE和CK+三个表情识别数据集上进行模型评估。环境部署基于Python3和Keras2(TensorFlow后端),具体依赖安装如下(推荐使用conda或者venv虚拟环境)gitclonehttp…

    2022年4月9日
    58

发表回复

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

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