转自: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. How to Pronounce UMBRELLA

    How to Pronounce UMBRELLA Share Tweet Share Tagged With: 3-Syllable When the weather is bad, you’ll ...

  2. JDBC之使用配置文件链接数据库

    写在前面 JDBC以一种统一的方式来对各种各样的数据库进行存取,JDBC为开发人员隐藏了不同数据库的不同特性.程序员开发时,知道要开发访问数据库的应用,于是将一个对应数据库的JDBC驱动程序类的引用进 ...

  3. MySQL Installation of system tables failed!

    刚开始学习Linux,就遇到了问题. 当在RedHat下安装MySQL时提示如下错误,请高手给点指点,谢谢: rpm -vih  MySQL-server-community-5.0.96-1.rhe ...

  4. 最短路径Dijkstra算法(邻接矩阵)

    Dijkstra算法的原理: 从某个源点到其余各顶点的最短路径,即单源点最短路径(仅适合非负权值图).单源点最短路径是指:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径.迪杰斯特拉(Dij ...

  5. Ubuntu 16.04中VirtualBox 5.1使用U盘/USB设备的方法

    环境: Ubuntu 16.04 LTS VirtualBox 5.1.26 r118224 虚拟机系统:Windows 7 SP1 64 安装扩展: 在这里下载:(自己注意版本好,版本不匹配安装不成 ...

  6. Dice

    Dice http://acm.hdu.edu.cn/showproblem.php?pid=5012 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  7. 最高频的K个单词 · Top K Frequent Words

    [抄题]: 给一个单词列表,求出这个列表中出现频次最高的K个单词. [思维问题]: 以为已经放进pq里就不能改了.其实可以改,利用每次取出的都是顶上的最小值就行了.(性质) 不知道怎么处理k个之外的数 ...

  8. OC 线程操作3 - NSOperation

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  9. 在java工程中导入jar包的注意事项

    在java工程中导入jar包后一定要bulid path,不然jar包不可以用.而在java web工程中导入jar包后可以不builld path,但最好builld path.

  10. Django之virtualenv下安装xadmin

    1.安装xadmin,通过pip 进入virtualenv pip安装xadmin pyyuc:~ yuchao$ source PycharmProjects/mxvenv/bin/activate ...