我们先看看COM所支持的一些类型的基本类:

(微软提供,在comdef.h中定义)

在COM中使用的标准类Class如下所示:

_bstr_t:对BSTR类型进行打包,并提供有用的操作和方法;

_com_error:定义抛出的error对象;

_com_ptr_t:封装COM接口指针

_variant_t:对VARIANT类型进行打包,并提供有用的操作和方法;

一、_variant_t类的简单介绍:

_variant_t对象封装了VARIANT数据类型。

The class manages resource allocation and deallocation and makes function calls to VariantInit and VariantClear as appropriate.

(1) _variant类提供的方法:

1> 构造函数

_variant_t

对_variant_t变量初始化调用的是_variant_t的构造函数。我们一般习惯于用一个int型的变量对数字类的变量进行初始化,这对_variant_t变量是不允许的。

原因很简单,_variant_t 的构造函数中没有用整型( Int )对其初始化的构造函数

可先将整型转化成long,然后再对其进行初始化


2> Attach()

Attaches a VARIANT object into the _variant_t object.

3> Clear()

Clears the encapsulated VARIANT object.

4> ChangeType

Changes the type of the _variant_t object to the indicated VARTYPE.

5> Detach

Detaches the encapsulated VARIANT object from this _variant_t object.

6> SetString

将一个string赋值给_variant_t对象;

7> Operators

赋值操作,给现有的_variant_t对象赋一个新值;

8> operator ==, !=

对比两个 _variant_t 对象是否相等;

9> Extractors

Extract data from the encapsulated VARIANT object.

(2) _variant_t的定义:

_variant_t类封闭了VARIANT数据类型,VARIANT是一个结构体类型,我们可以看一下它的定义

注意:vt用来存储内部变量(联合体中保存的变量)的类型,联合体用来存储对应类型的值

二、数据类型转换

_bstr_t类可以作为_variant_t类与基本数据类型转换的中介

(1) _variant_t与CString之间的转化

1> CString转换为_variant_t:

使用_variant_t的成员函数SetString来对_variant_t的对象赋值会更好;

2> _variant_t转换为CString:

_variant_t vt;
CString tempstr=(LPCSTR)_bstr_t(vt); //_bstr_t的构造函数有对_variant_t类型的处理

(2) _variant_t与char *之间的转换

1> char * 转换为_variant_t

方法与CString转换为_variant_t的方法类似:

char * cValue;
_variant_t vValue=(LPSTR)cValue;

2> _variant_t转换为char *:

错误方法:

_variant_t vValue;
char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)

value指向一堆乱码...

原因:不能用char *直接指向(LPSTR)(LPCSTR)_bstr_t( _variant_t ),因为这样转换之后实际上是一个string,而非一个char *

正确方法:

进行转换时,只能用strcpy(),将LPSTR指向的字符复制到char * 所指向的内存中;

如下例:

_variant_t vValue;
char cValue[]={};
strcpy(cValue, (LPCSTR)_bstr_t(vValue));

(3) 判断_variant_t的值类型

下面的转换代码根据_variant_t的vt进行类型判断,然后将数据值转换为CString类型(可作为转换为其他数据类型的中介)

CString str;  

//以下代码演示如何转换为C标准字符串型
switch(var.vt)
{
case VT_BSTR:
{
str=var.bstrVal;
break;
}
case VT_I2: //var is short int type
{
str.Format("%d",(int)var.iVal);
break;
}
case VT_I4: //var is long int type
{
str.Format("%d", var.lVal);
break;
}
case VT_R4: //var is float type
{
str.Format("%10.6f", (double)var.fltVal);
break;
}
case VT_R8: //var is double type
{
str.Format("%10.6f", var.dblVal);
break;
}
case VT_CY: //var is CY type
{
str=COleCurrency(var).Format();
break;
}
case VT_DATE: //var is DATE type
{
str=COleDateTime(var).Format();
break;
}
case VT_BOOL: //var is VARIANT_BOOL
{
str= (var.boolVal==) ?"FALSE": "TRUE";
break;
}
default:
{
str.Format("Unk type %d\n",var.vt);
TRACE("Unknown type %d\n",var.vt);
break;
}
}

_variant_t的使用的更多相关文章

  1. _variant_t与其他数据类型的转换

    转自:http://kuaixingdong.blog.hexun.com/29627840_d.html 我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在COM ...

  2. _variant_t和_bstr_t

    _variant_t和_bstr_t这两个类分别封装并管理VARIANT和BSTR这两种数据类型, VARIANT和BSTR这两种类型是COM中使用的数据类型. 实现_variant_t向int,St ...

  3. tagVARIANT、VARIANT、_variant_t和COleVariant

    tagVARIANT是一个结构体struct:  C++ Code: tagVARIANT 123456789101112131415161718192021222324252627282930313 ...

  4. 关于如何将_variant_t型转化为int型和string类型

    1)将_variant_t型转化为int型 关于将_variant_t型转化为int型,网上有好多好多参考,但好多都很复杂并且还不对,其实整个转化过程就只一行代码可以搞定: _variant_t a; ...

  5. VARIANT、 _variant_t、CComVariant、COleVariant、CDBVariant

    参考文章 http://blog.163.com/wslngcjsdxdr@126/blog/static/16219623020107634935586/ http://blog.csdn.net/ ...

  6. _variant_t 与其他数据类型的转换

    在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作方法: _com_error:定义抛出的error对象; _com_ptr_t:封装COM接口指针 ...

  7. C++ 操作XML文件 使用MSXML.DLL

    使用MSXML.DLL读写XML; 文件顶部加入 #import "msxml3.dll"; using namespace MSXML2; //这两句作用是,在程序的文件夹下生成 ...

  8. MFC 创建XML

    void CreateXml() { CoInitialize(NULL); // 创建文档 MSXML2::IXMLDOMDocument2Ptr pXMLDoc = NULL; //创建DOMDo ...

  9. MFC如何读取XML

    <?xml version="1.0" encoding="utf-8"?> <Cases> <case> <No&g ...

随机推荐

  1. appium服务——封装生成可用端口

    一.判断端口是否可用 1.在windows中判断端口是否可用,使用dos命令"netstat -ano| findstr 8080".运行结果有如下两种 如果没有被占用,就是结果为 ...

  2. iphone状态栏,导航栏,标签栏高度一览表

    iphone状态栏,导航栏,标签栏高度一览表   设备分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus  1242×2208 px 60px  132px  147px iPhon ...

  3. 解决java中按照数字大小来排序文件

    我们想要输出(1.jpg.2.jpg.3.jpg.10.jpg.11.jpg.20.jpg.21.jpg.31.jpg) 突然看到网上一些写法 总结:既然自己按照定义的文件名规则来处理,也可以进行使用 ...

  4. 17.视图--SQL

    一.什么是视图 视图是虚拟的表 为什么使用视图 重用SQL语句. 简化复杂的SQL操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节. 使用表的一部分而不是整个表. 保护数据.可以授予用户访 ...

  5. python入门2(补发a)

    一.流程控制-while循环,结构如下: while 条件: 结果 如果条件是真,则直接执行结果,然后再次判断条件,直到条件是假,停止循环 那么我们如何终止循环呢? 1,改变循环条件 2,break ...

  6. NET Core+MySql+Nginx

    NET Core+MySql+Nginx 容器化部署 .NET Core容器化@Docker.NET Core容器化之多容器应用部署@Docker-Compose.NET Core+MySql+Ngi ...

  7. Mac OS X

    Mac OS X 除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE等)都提供了很好的 ...

  8. CoreCLR

    CoreCLR 在这篇中我将讲述GC Collector内部的实现, 这是CoreCLR中除了JIT以外最复杂部分,下面一些概念目前尚未有公开的文档和书籍讲到. 为了分析这部分我花了一个多月的时间,期 ...

  9. this、apply、call的指向

    1.关于this this它总是返回一个对象,是指调用当前函数的对象,由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的. var person={ name: ...

  10. 《从0到1学习Flink》—— 如何自定义 Data Sink ?

    前言 前篇文章 <从0到1学习Flink>-- Data Sink 介绍 介绍了 Flink Data Sink,也介绍了 Flink 自带的 Sink,那么如何自定义自己的 Sink 呢 ...