_variant_t与其他数据类型的转换
转自: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与其他数据类型的转换相关推荐
- VC常用数据类型使用转换详解
VC常用数据类型使用转换详解 出 处:PCVC.NET 作 者:程佩君 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用. 我们先定义一些常见类型变量借以 ...
- PyTorch 笔记(03)— Tensor 数据类型分类(默认数据类型、CPU tensor、GPU tensor、CPU 和 GPU 之间的转换、数据类型之间转换)
1. Tensor 数据类型 Tensor 有不同的数据类型,如下表所示,每种类型都有 CPU 和 GPU 版本(HalfTensor)除外,默认的 tensor 是数据类型是 FloatTensor ...
- Php的if自动转换类型,php之数据类型自动转换,php之数据类型转换_PHP教程
php之数据类型自动转换,php之数据类型转换 1:概述 ---php是一种弱类型的语言,它可以根据运行环境的变化而自动进行数据类型的转换 1.1转换成布尔类型的原则 以下值都将转换成布尔类型中的fa ...
- java数据类型转化_JAVA基本数据类型及其转换
Java语言是一种强类型语言.这意味着每个变量都必须有一个声明好的类型.Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型.Java另外还提供大数字对 ...
- matlab中float类型的_【Python基础学习】2. 变量、基本数据类型及其转换
知行校园汇 记录学习.分享干货.吐槽人生! 关注 相关说明 文章内容:变量.基本数据类型及其转换 作者博客:csdn.cxhit.com www.cxhit.com 1. 变量 1.1 变量规则 在P ...
- 2017-2-19 C#基础 基本数据类型的转换,转义字符,常量
1.基本数据类型的转换分两种:自动转换(隐式转换)和强制转换(显式转换).自动转换是从只类型转换到引用类型.强制转换是最长用的,是从引用类型转换到值类型或者从浮点型转换到整形.强制转换主要有三种形式: ...
- 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
最近在ASP.NET MVC中遇到一个问题,如题,在使用EF数据模型的时候,要去添加一条新的数据到Sqlserver数据库,在之前项目中并没有出现该异常,所以去扒了扒demo,发现有几个字段(数据库类 ...
- numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray)
numpy 下的数据结构与数据类型的转换(np.array vs. np.asarray) 原创 2017年02月18日 10:35:43
- 数据类型的转换(范围最大的)
数据类型的转换(范围最大的): *最大的是字符串,什么都可以自动转换为字符串 public class test2 {public static void main(String[] args) {c ...
最新文章
- snapd_snapd使管理Nextcloud变得轻而易举
- spring中controller与jsp之间的那些事儿
- 服务器子系统是什么,服务器是什么样子的,服务器一般用什么系统!
- lc滤波器是利用电感的感抗_你对LC谐振电路你都了解吗
- mysql中datetime比较大小问题 (转的)
- Scrapy 爬取京东商城华为全系列手机评论
- 安卓电子书格式_求把 EPUB 转换成 MOBI 的电子书格式转换工具
- docker装LibreELEC_Linux和macOS系统安装LibreELEC的方法
- 【Javaweb 1】带你搞懂request,respond,servlet
- 利用互斥量实现进程间同步
- hosts : IP - 主机名/域名映射
- 管道与命名管道(FIFO)
- 初学Java 从0-1创建Spring boot+Mybatis - plus+Swagger2+Mysql(代码生成器)
- Java-Excel报表开发POI(含POI保护工作表功能)
- Android之动画(一)
- props特性的深入了解
- YC1040载货汽车底盘总体及制动器设计
- [LINUX]解决Linux下ubuntu 20.04暂时不能解析域名“cn.archive.ubuntu.com”问题
- Codesys禾川Q1配置SV-X3EB实现单轴控制
- endnote文献服务器运行失败,EndNote在插入大量文献时出现错误怎么破 | 科研动力...
热门文章
- Frenetic Python实验(二)
- SSL/TLS - 什么是SSL?
- 常见的对称式加密与非对称式加密算法
- 海思Hi3136芯片怎么样?Hi3136处理器参数介绍
- 北京冬奥带火“数字雪花”,隐藏的科技秘密暴露了
- 手游直播正在连接推流服务器,游戏直播时Airplay投屏卡死完美解决方案
- 使用R语言 在rstudio中出现 列的数目比列的名字要多 的问题
- 宠物食品“味及”完成数百万天使轮+融资
- 超级账本Hyperledger Fabric的使用
- Spring Boot的优点