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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue2使用animate css[通俗易懂]

    vue2使用animate css[通俗易懂]vue2使用animatecss先上几个链接vue插件大集合:awesome-vuevue2插件:vue2-animate:vue2-animatevue2插件vue2-animateDEMO:vue2-animatedemo:vue2-animate-demo我想用过animatecss的都知道这是一个极其简单而又酷炫的css动画库,但是我想在vue2中使用anima

    2022年7月12日
    16
  • ZOJ问题(坑死了)「建议收藏」

    ZOJ问题(坑死了)「建议收藏」ZOJ问题TimeLimit:2000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission

    2022年7月4日
    26
  • java运行环境_如何搭建Java运行环境?

    java运行环境_如何搭建Java运行环境?前言对于运行一个Java程序,我们首先需要有一个运行Java程序的平台程序,这个平台程序就是Java虚拟机。本篇文章将介绍如何在Windows系统上搭建一个Java程序的运行环境,主要分为两个步骤:安装JDK,配置环境变量。Windows系统Java运行环境配置下载JDK并安装首先我们需要下载java开发工具包JDK,JDK中包含了JRE(Java运行环境)和一些官方提供给我们的工具,在oracl…

    2022年7月7日
    19
  • 解决docker下载镜像速度过慢_docker image是什么

    解决docker下载镜像速度过慢_docker image是什么前言上一篇讲到pull镜像,但是pull镜像的时候下拉的速度实在感人,有什么解决办法吗?我们只需将docker镜像源修改为国内的将docker镜像源修改为国内的:在/etc/docker/d

    2022年7月29日
    13
  • strstr函数实现

    strstr函数实现strstr()函数用来查找子串的首地址,函数实现如下:char*strstr(char*str1,char*str2){ char*p1=NULL; char*p2=NULL; while(*str1) { p1=str1; p2=str2; while(*p1==*p2&&*p2!=NULL) { p1++; p2…

    2022年6月25日
    30
  • jqGrid基本用法与示例「建议收藏」

    jqGrid基本用法与示例「建议收藏」转自:https://chuanlu.iteye.com/blog/1953544一、jqGrid的基本用法1、html页面Html代码<!DOCTYPE html 

    2022年7月3日
    53

发表回复

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

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