转自:http://kuaixingdong.blog.hexun.com/29627840_d.html

我们先看看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是一个结构体类型,我们可以看一下它的定义

typedef struct tagVARIANT
{VARTYPE vt;                                //存储数据类型unsigned short wReserved1;unsigned short wReserved2;unsigned short wReserved3;union {Byte bVal;                         // VT_UI1.Short iVal;                           // VT_I2.long lVal;                         // VT_I4.float fltVal;                      // VT_R4.double dblVal;                     // VT_R8.VARIANT_BOOL boolVal;              // VT_BOOL.SCODE scode;                     // VT_ERROR.CY cyVal;                           // VT_CY.DATE date;                         // VT_DATE.BSTR bstrVal;                        // VT_BSTR.DECIMAL FAR* pdecVal             // VT_BYREF|VT_DECIMAL.IUnknown FAR* punkVal;               // VT_UNKNOWN.IDispatch FAR* pdispVal;          // VT_DISPATCH.SAFEARRAY FAR* parray;               // VT_ARRAY|*.Byte FAR* pbVal;                  // VT_BYREF|VT_UI1.short FAR* piVal;                    // VT_BYREF|VT_I2.long FAR* plVal;                  // VT_BYREF|VT_I4.float FAR* pfltVal;                   // VT_BYREF|VT_R4.double FAR* pdblVal;              // VT_BYREF|VT_R8.VARIANT_BOOL FAR* pboolVal;           // VT_BYREF|VT_BOOL.SCODE FAR* pscode;                  // VT_BYREF|VT_ERROR.CY FAR* pcyVal;                        // VT_BYREF|VT_CY.DATE FAR* pdate;                  // VT_BYREF|VT_DATE.BSTR FAR* pbstrVal;                 // VT_BYREF|VT_BSTR.IUnknown FAR* FAR* ppunkVal;        // VT_BYREF|VT_UNKNOWN.IDispatch FAR* FAR* ppdispVal;       // VT_BYREF|VT_DISPATCH.SAFEARRAY FAR* FAR* pparray;        // VT_ARRAY|*.VARIANT FAR* pvarVal;             // VT_BYREF|VT_VARIANT.void FAR* byref;                 // Generic ByRef.char cVal;                         // VT_I1.unsigned short uiVal;              // VT_UI2.unsigned long ulVal;              // VT_UI4.int intVal;                           // VT_INT.unsigned int uintVal;             // VT_UINT.char FAR * pcVal;                    // VT_BYREF|VT_I1.unsigned short FAR * puiVal;      // VT_BYREF|VT_UI2.unsigned long FAR * pulVal;          // VT_BYREF|VT_UI4.int FAR * pintVal;                   // VT_BYREF|VT_INT.unsigned int FAR * puintVal;     //VT_BYREF|VT_UINT.};
};

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

二、数据类型转换

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

(1) _variant_t与CString之间的转化

1> CString转换为_variant_t:

CString str;
_variant_t str1=(LPCTSTR)str; 

使用_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[16]={0};
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==0) ?"FALSE": "TRUE";break;}default:{str.Format("Unk type %d\n",var.vt);TRACE("Unknown type %d\n",var.vt);break;}
}

_variant_t与其他数据类型的转换相关推荐

  1. VC常用数据类型使用转换详解

    VC常用数据类型使用转换详解 出  处:PCVC.NET 作  者:程佩君 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用. 我们先定义一些常见类型变量借以 ...

  2. PyTorch 笔记(03)— Tensor 数据类型分类(默认数据类型、CPU tensor、GPU tensor、CPU 和 GPU 之间的转换、数据类型之间转换)

    1. Tensor 数据类型 Tensor 有不同的数据类型,如下表所示,每种类型都有 CPU 和 GPU 版本(HalfTensor)除外,默认的 tensor 是数据类型是 FloatTensor ...

  3. Php的if自动转换类型,php之数据类型自动转换,php之数据类型转换_PHP教程

    php之数据类型自动转换,php之数据类型转换 1:概述 ---php是一种弱类型的语言,它可以根据运行环境的变化而自动进行数据类型的转换 1.1转换成布尔类型的原则 以下值都将转换成布尔类型中的fa ...

  4. java数据类型转化_JAVA基本数据类型及其转换

    Java语言是一种强类型语言.这意味着每个变量都必须有一个声明好的类型.Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型.Java另外还提供大数字对 ...

  5. matlab中float类型的_【Python基础学习】2. 变量、基本数据类型及其转换

    知行校园汇 记录学习.分享干货.吐槽人生! 关注 相关说明 文章内容:变量.基本数据类型及其转换 作者博客:csdn.cxhit.com www.cxhit.com 1. 变量 1.1 变量规则 在P ...

  6. 2017-2-19 C#基础 基本数据类型的转换,转义字符,常量

    1.基本数据类型的转换分两种:自动转换(隐式转换)和强制转换(显式转换).自动转换是从只类型转换到引用类型.强制转换是最长用的,是从引用类型转换到值类型或者从浮点型转换到整形.强制转换主要有三种形式: ...

  7. 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值

    最近在ASP.NET MVC中遇到一个问题,如题,在使用EF数据模型的时候,要去添加一条新的数据到Sqlserver数据库,在之前项目中并没有出现该异常,所以去扒了扒demo,发现有几个字段(数据库类 ...

  8. numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)

    numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray) 原创  2017年02月18日 10:35:43

  9. 数据类型的转换(范围最大的)

    数据类型的转换(范围最大的): *最大的是字符串,什么都可以自动转换为字符串 public class test2 {public static void main(String[] args) {c ...

最新文章

  1. snapd_snapd使管理Nextcloud变得轻而易举
  2. spring中controller与jsp之间的那些事儿
  3. 服务器子系统是什么,服务器是什么样子的,服务器一般用什么系统!
  4. lc滤波器是利用电感的感抗_你对LC谐振电路你都了解吗
  5. mysql中datetime比较大小问题 (转的)
  6. Scrapy 爬取京东商城华为全系列手机评论
  7. 安卓电子书格式_求把 EPUB 转换成 MOBI 的电子书格式转换工具
  8. docker装LibreELEC_Linux和macOS系统安装LibreELEC的方法
  9. 【Javaweb 1】带你搞懂request,respond,servlet
  10. 利用互斥量实现进程间同步
  11. hosts : IP - 主机名/域名映射
  12. 管道与命名管道(FIFO)
  13. 初学Java 从0-1创建Spring boot+Mybatis - plus+Swagger2+Mysql(代码生成器)
  14. Java-Excel报表开发POI(含POI保护工作表功能)
  15. Android之动画(一)
  16. props特性的深入了解
  17. YC1040载货汽车底盘总体及制动器设计
  18. [LINUX]解决Linux下ubuntu 20.04暂时不能解析域名“cn.archive.ubuntu.com”问题
  19. Codesys禾川Q1配置SV-X3EB实现单轴控制
  20. endnote文献服务器运行失败,EndNote在插入大量文献时出现错误怎么破 | 科研动力...

热门文章

  1. Frenetic Python实验(二)
  2. SSL/TLS - 什么是SSL?
  3. 常见的对称式加密与非对称式加密算法
  4. 海思Hi3136芯片怎么样?Hi3136处理器参数介绍
  5. 北京冬奥带火“数字雪花”,隐藏的科技秘密暴露了
  6. 手游直播正在连接推流服务器,游戏直播时Airplay投屏卡死完美解决方案
  7. 使用R语言 在rstudio中出现 列的数目比列的名字要多 的问题
  8. 宠物食品“味及”完成数百万天使轮+融资
  9. 超级账本Hyperledger Fabric的使用
  10. Spring Boot的优点