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

  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:

  1. CString str;
  2. _variant_t str1=(LPCTSTR)str;

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

2> _variant_t转换为CString:

  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的方法类似:

  1. char * cValue;
  2. _variant_t vValue=(LPSTR)cValue;

2> _variant_t转换为char *:

错误方法:

  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 * 所指向的内存中;

如下例:

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

(3) 判断_variant_t的值类型

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

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

_variant_t与其他数据类型的转换的更多相关文章

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

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

  2. java中数据类型的转换

    数据类型的转换,分为自动转换和强制转换. 自动转换是程序执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换 强制转换必须在代码中声明,转换顺序不受限制 自动数据类 ...

  3. Java的基本数据类型与转换

    1.1 Java为什么需要保留基本数据类型 http://www.importnew.com/11915.html 基本数据类型对大多数业务相关或网络应用程序没有太大的用处,这些应用一般是采用客户端/ ...

  4. java的数据类型的转换

    一:java的数据类型转换除布尔类型boolean(不能转换)有两种:<一> 自动转换: <二> 强制转换 <一>.自动转换:就是将小的数据类型自动转换成大的数据类 ...

  5. JavaScript学习笔记——数据类型强制转换和隐式转换

    javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...

  6. JAVA数据类型自动转换,与强制转换

    一.数据类型自动转换 public class Test{ public static void main(String[] args){ int a = 1; double b = 1.5; dou ...

  7. Java学习笔记之:Java数据类型的转换

    一.介绍 数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换:强制类型转换则必须在代码中声明,转换顺序不受 ...

  8. 语言基础:C#输入输出与数据类型及其转换

    今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console ...

  9. C#基础(八)——C#数据类型的转换

    C#数据类型的转换主要有以下几种方式: 1.强制转换 注意:char类型不能强制转换成int,如果使用强制转化,得到的是原整数的ASCII码值. 2.class.parse(string类型的变量), ...

随机推荐

  1. ADO接口简介

    源地址:http://blog.csdn.net/xiaobai1593/article/details/7449151 参考: 1. 百度文库:http://wenku.baidu.com/view ...

  2. 经典动态规划python实现

    1.最长上升子序列 对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui < Ui+1,且A[U ...

  3. mysql 导入csv 转义

    TERMINATED :分隔符 ESCAPED :转义用什么标示,‘’ 不设置转义符 LOAD DATA LOCAL INFILE '/home/tmp/1999/holder.csv'  INTO ...

  4. Error running : Address localhost:1099 is already in use

    运行报错: Error running  : Address localhost:1099 is already in use 解决方法: 打开任务管理器,将后台的java.exe进程都关掉,再次运行 ...

  5. cdoj842-天下归晋 【树状数组】

    http://acm.uestc.edu.cn/#/problem/show/842 天下归晋 Time Limit: 3000/1000MS (Java/Others)     Memory Lim ...

  6. A计划(BFS)

    A计划 http://acm.hdu.edu.cn/showproblem.php?pid=2102 Time Limit: 3000/1000 MS (Java/Others)    Memory ...

  7. 【Spring】Spring boot多数据源历险记

    一.问题描述 笔者根据需求在开发过程中,需要在原项目的基础上(单数据源),新增一个数据源C,根据C数据源来实现业务.至于为什么不新建一个项目,大概是因为这只是个小功能,访问量不大,不需要单独申请个服务 ...

  8. discuz的diy功能介绍

    可以通过页面操作的方式,完成页面布局设计,数据聚合,样式等常见的页面处理功能.   以管理员登陆discuz的前台时,会出现一个diy按钮. 流程,先设计框架,再完成数据的聚合.     定义模板时, ...

  9. discuz回贴通知插件实现-页面嵌入点(钩子)

    1.如何保证主题被回复时业务代码被执行. 2.获得主题,主题发布者,贴子等信息. 3.discuz发送email邮件.   discuz使用嵌入点(钩子)来处理代码的执行时机. 当用户开启插件开发者模 ...

  10. 本地Maven环境配置

    本地Maven环境配置 下载配置文件:http://10.1.10.138:6060/root/DevelopmentSpecification/archive/master.zip 解压master ...