_variant_t与其他数据类型的转换

2024-02-28 13:48
文章标签 数据类型 转换 variant

本文主要是介绍_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是一个结构体类型,我们可以看一下它的定义

[cpp]  view plain copy
  1. typedef struct tagVARIANT   
  2. {  
  3.     VARTYPE vt;                             //存储数据类型  
  4.     unsigned short wReserved1;  
  5.     unsigned short wReserved2;  
  6.     unsigned short wReserved3;  
  7.     union   
  8.     {  
  9.         Byte bVal;                          // VT_UI1.  
  10.         Short iVal;                         // VT_I2.  
  11.         long lVal;                          // VT_I4.  
  12.         float fltVal;                       // VT_R4.  
  13.         double dblVal;                      // VT_R8.  
  14.         VARIANT_BOOL boolVal;               // VT_BOOL.  
  15.         SCODE scode;                        // VT_ERROR.  
  16.         CY cyVal;                           // VT_CY.  
  17.         DATE date;                          // VT_DATE.  
  18.         BSTR bstrVal;                       // VT_BSTR.  
  19.         DECIMAL FAR* pdecVal                // VT_BYREF|VT_DECIMAL.  
  20.         IUnknown FAR* punkVal;              // VT_UNKNOWN.  
  21.         IDispatch FAR* pdispVal;            // VT_DISPATCH.  
  22.         SAFEARRAY FAR* parray;              // VT_ARRAY|*.  
  23.         Byte FAR* pbVal;                    // VT_BYREF|VT_UI1.  
  24.         short FAR* piVal;                   // VT_BYREF|VT_I2.  
  25.         long FAR* plVal;                    // VT_BYREF|VT_I4.  
  26.         float FAR* pfltVal;                 // VT_BYREF|VT_R4.  
  27.         double FAR* pdblVal;                // VT_BYREF|VT_R8.  
  28.         VARIANT_BOOL FAR* pboolVal;         // VT_BYREF|VT_BOOL.  
  29.         SCODE FAR* pscode;                  // VT_BYREF|VT_ERROR.  
  30.         CY FAR* pcyVal;                     // VT_BYREF|VT_CY.  
  31.         DATE FAR* pdate;                    // VT_BYREF|VT_DATE.  
  32.         BSTR FAR* pbstrVal;                 // VT_BYREF|VT_BSTR.  
  33.         IUnknown FAR* FAR* ppunkVal;        // VT_BYREF|VT_UNKNOWN.  
  34.         IDispatch FAR* FAR* ppdispVal;      // VT_BYREF|VT_DISPATCH.  
  35.         SAFEARRAY FAR* FAR* pparray;        // VT_ARRAY|*.  
  36.         VARIANT FAR* pvarVal;               // VT_BYREF|VT_VARIANT.  
  37.         void FAR* byref;                    // Generic ByRef.  
  38.         char cVal;                          // VT_I1.  
  39.         unsigned short uiVal;               // VT_UI2.  
  40.         unsigned long ulVal;                // VT_UI4.  
  41.         int intVal;                         // VT_INT.  
  42.         unsigned int uintVal;               // VT_UINT.  
  43.         char FAR * pcVal;                   // VT_BYREF|VT_I1.  
  44.         unsigned short FAR * puiVal;        // VT_BYREF|VT_UI2.  
  45.         unsigned long FAR * pulVal;         // VT_BYREF|VT_UI4.  
  46.         int FAR * pintVal;                  // VT_BYREF|VT_INT.  
  47.         unsigned int FAR * puintVal;        //VT_BYREF|VT_UINT.  
  48.     };  
  49. };  
注意: vt用来存储内部变量(联合体中保存的变量)的类型,联合体用来存储对应类型的值

二、数据类型转换

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

(1) _variant_t与CString之间的转化

1> CString转换为_variant_t:

[cpp]  view plain copy
  1. CString str;  
  2. _variant_t str1=(LPCTSTR)str;   
使用_variant_t的成员函数SetString来对_variant_t的对象赋值会更好;

2> _variant_t转换为CString:

[cpp]  view plain copy
  1. _variant_t vt;  
  2. CString tempstr=(LPCSTR)_bstr_t(vt);         //_bstr_t的构造函数有对_variant_t类型的处理  

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

1> char * 转换为_variant_t

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

[cpp]  view plain copy
  1. char * cValue;  
  2. _variant_t vValue=(LPSTR)cValue;  
2> _variant_t转换为char *:

错误方法:

[cpp]  view plain copy
  1. _variant_t vValue;  
  2. char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)  

value指向一堆乱码...

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

正确方法:

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

如下例:

[cpp]  view plain copy
  1. _variant_t vValue;  
  2. char cValue[16]={0};  
  3. strcpy(cValue, (LPCSTR)_bstr_t(vValue));  

(3) 判断_variant_t的值类型

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

[cpp]  view plain copy
  1. CString str;  
  2.   
  3. //以下代码演示如何转换为C标准字符串型  
  4. switch(var.vt)  
  5. {  
  6.     case VT_BSTR:  
  7.     {  
  8.         str=var.bstrVal;  
  9.         break;  
  10.     }  
  11.     case VT_I2: //var is short int type   
  12.     {  
  13.         str.Format("%d",(int)var.iVal);  
  14.         break;  
  15.     }  
  16.     case VT_I4: //var is long int type  
  17.     {  
  18.         str.Format("%d", var.lVal);  
  19.         break;  
  20.     }  
  21.     case VT_R4: //var is float type  
  22.     {  
  23.         str.Format("%10.6f", (double)var.fltVal);  
  24.         break;  
  25.     }  
  26.     case VT_R8: //var is double type  
  27.     {  
  28.         str.Format("%10.6f", var.dblVal);  
  29.         break;  
  30.     }  
  31.     case VT_CY: //var is CY type  
  32.     {  
  33.         str=COleCurrency(var).Format();  
  34.         break;  
  35.     }  
  36.     case VT_DATE: //var is DATE type  
  37.     {  
  38.         str=COleDateTime(var).Format();  
  39.         break;  
  40.     }  
  41.     case VT_BOOL: //var is VARIANT_BOOL  
  42.     {  
  43.         str= (var.boolVal==0) ?"FALSE""TRUE";  
  44.         break;  
  45.     }  
  46.     default:  
  47.     {  
  48.         str.Format("Unk type %d\n",var.vt);  
  49.         TRACE("Unknown type %d\n",var.vt);  
  50.         break;  
  51.     }  
  52. }  

这篇关于_variant_t与其他数据类型的转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755680

相关文章

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

Redis地理数据类型GEO

通常要计算两个地理位置的距离不是很方便,这里可以直接通过Redis提供的GEO操作来完成地理位置相关的计算 1)添加地理位置 语法:geoadd key longitude latitude member [longitude latitude member] ...字段说明:key:存放地理位置的集合名称longitude:地理坐标的经度latitude:地理坐标的纬度member:表示这

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

VC环境下整型转换为字符串型(2)

在串口下位机的发送中,可能会用到需要发送数字,显示为字符串型的 和上一篇文字《串口中字符串转换为整型》一正一反,知识点学习会了: #include<iostream.h> #include <stdio.h> #include <string.h>   void inttostr(int m,unsigned char * str) { int length=0;   int tmp,te

时间日期与时间戳转换(Linux C)

本文主要学习三个知识点,第一是UTC时间、GMT时间的概念;第二是在Unix环境下UTC时间与时间戳的转换;第三是在C语言中如何修改时区。 本文参考了《UNP》以及 http://blog.csdn.net/foxir/article/details/43916601 http://blog.csdn.net/ljafl9988/article/details/16847935 一、

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系 二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐标系与其他坐标系之间的转换5. 传感器坐标系与其他坐标系之间的转换 三、坐标系转换工具 一