我们先看看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. JS Guid生成

    function numToGuid(uid) { var str = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; var l = uid.to ...

  2. VS~通过IIS网站启用"域名"调试

    在我们开发网站时,对某些信息进行序列化时,通常使用session,cookies,nosql等技术,而为了安全,我们在服务器上很多情况都做了防止盗链的设计,这给本机调试带来了不便,因为,本机都是以lo ...

  3. 多版本Shader与multi_compile

    多版本Shader与multi_compile   https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html   #pragma ...

  4. 洛谷P2134 百日旅行

    P2134 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.——小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场大考时默 ...

  5. JS实现动态瀑布流及放大切换图片效果(js案例)

    整理了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下. 该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击 ...

  6. python基本数据类型2——操作

    字符串 name = "alex" # 移除两边的空格 print(name.strip()) #strip不修改值 # 是否以"al"开头 print(nam ...

  7. 黑马学习MyBatis 用MyBatis对表进行条件查询 模糊查询 动态sql

    package cn.itcast.domain; /* CREATE TABLE `message` ( `id` int(11) NOT NULL, `command` varchar(16) D ...

  8. Java流程控制和数组

    流程控制 Java中三种基本的流程控制结构:顺序结构,分支结构和循环结构. 顺序结构,任何编程语言中都会有的程序结构. 分支结构:Java语言中常见的两种, if语句和switch语句. if语句,使 ...

  9. jquery.jscrollpane.js滚动速度设置

    首先找到插件里面的这个函数,改变成下面的样子: function initMousewheel() { container.unbind(mwEvent).bind( mwEvent, functio ...

  10. jquery扩展方法详解

    http://www.jb51.net/article/51079.htm https://www.cnblogs.com/xuxiuyu/p/5989743.html     ---更详细