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)
上一篇 2022年7月18日 下午6:46
下一篇 2022年7月18日 下午6:46


相关推荐

  • CSV乱码转换

    CSV乱码转换1 右键 CSV 文件 用文本工具打开 例如 notepad 2 文本设置下编码格式 例 udf 8 保存 3 最后再打开 CSV 编码格式就是正确的了 1 2 设置编码格式保存 3 再次打开乱码就不存在

    2026年3月20日
    2
  • 阿里 CEO 吴泳铭现身千问“换帅”沟通会,表态 Qwen 是“第一优先级”

    阿里 CEO 吴泳铭现身千问“换帅”沟通会,表态 Qwen 是“第一优先级”

    2026年3月13日
    3
  • JAVA标识符命名规则及命名规范[通俗易懂]

    JAVA标识符命名规则及命名规范[通俗易懂]文章目录一、标识符可以标识什么二、标识符是什么三、标识符命名规则一、标识符可以标识什么标识符可以标识类名、方法名、变量名、接口名、常量名等。二、标识符是什么凡是程序员自己有权利命名单词的叫做标识符。但是main虽然是标识符,但是程序员不能修改。三、标识符命名规则命名规则属于语法机制,必须遵守,不遵守命名规则标识符不符合语法,编译器会报错。规则1:标识符只能有数字、字母(包括中文)、下划线、美元符号$组成。规则2:不能以数字开头。规则3:java关键字和保留字不能做为标识符。规则4:标

    2022年7月8日
    19
  • 深度用户提建议,增加智能体项目与 mcp隔离

    深度用户提建议,增加智能体项目与 mcp隔离

    2026年3月13日
    2
  • 小米5 Android 8.0解bl,小米解BL锁超详细的图文教程「建议收藏」

    小米5 Android 8.0解bl,小米解BL锁超详细的图文教程「建议收藏」BL锁全称bootloader锁,其中bootloader中文名称为“启动加载”,其主要作用是为了保护用户的隐私数据安全,在日常使用的时候感受不到BL锁的存在,但是如果你要对手机进行刷机的话,第一步就是必须先解除手机里的BL锁,部分机子不需要解BL锁,手机是否需要解锁请到手机官方网站进行查看或者咨询。解BL锁会清除手机所有的数据,相当于手机恢复出厂设置,记得提前备份好手机里的所有资料以下是小米解锁…

    2022年5月20日
    70
  • pycharm 修改镜像源_如何设置linux服务器镜像源

    pycharm 修改镜像源_如何设置linux服务器镜像源由于国外的镜像源安装Python速度较慢,选择国内的镜像速度较快,这篇文章如要讲述如何设置国内镜像源。常用镜像源:清华:https://pypi.tuna.tsinghua.edu.cn/simple阿里云:http://mirrors.aliyun.com/pypi/simple/中国科技大学https://pypi.mirrors.ustc.edu.cn/simple/方法一:…

    2022年8月29日
    7

发表回复

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

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