一、VARIANT、CComVariant类与CString是什么:

CString是MFC定义的字符串类,VARIANT是COM标准为了使COM组件能够被各种语言使用(vc++、vb、java、python等)而规定的一种统一型变量。即VARIANT能够转化成载体语言规定的变量类型,载体语言的变量类型也可以转化成VARIANT类型。

CComVariant类对VARIANT进行了类封装,并提供了操作方法。实际保存数据的仍然是CComVariant类封装的VARIANT变量。

由于VARIANT实际上是一个Struct结构体,而实际上Struct结构体和Class是同一种数据类型,因此可以说CComVariant类是VARIANT的子类,因此两者赋值的方法是一样的(区别在于CComVariant封装了一些方法:复制,清空,删除变量,类型转化等)。

二、VARIANT、CComVariant类初始化:

初始化用法:

VARIANT var;

var.vt=VT_BSTR; //vt属性定义VARIANT类型

var.bstrVar=_T("test text");//bstrVar是VT_BSTR类型对应的存值变量

如上文,VARIANT赋值的方法是先确定变量的类型,然后给相应变量赋值,CComVariant类也可以这样初始化,也可以通过类构造函数初始化。

vt取值可以为:VT_I2,VT_I4,VT_R4,VT_R8,VT_BSTR等,分别表示short,long,float,double,BSTR,对应的值分别存在iVal,lVal,fltVal,dblVal,bstrVar中。

具体可查询VARIANT结构的规定。

参考文献:https://blog.csdn.net/tangaowen/article/details/6553305

三、相互转化:

1.CString转VARIANT(CComVariant):

CString str=_T("test");

VARIANT var;

var.vt=VT_BSTR;

var.vstrVar=_bstr_t(str);//用MFC的_bstr_t类将CString字符串变量str包装后赋值即可。

2.VARIANT转CString

CString CSelectDlg::VariantToCString(VARIANT var)
{
      CString strValue;
     _variant_t var_t;
     _bstr_t bst_t;
     time_t cur_time;
     CTime time_value;
     COleCurrency var_currency;
     switch(var.vt)
    {
          case VT_EMPTY:
                 strValue=_T("");
                 break;
          case VT_UI1:
                 rValue.Format("%d",var.bVal);
                 break;
         case VT_I2:
                strValue.Format("%d",var.iVal);
                break;
         case VT_I4:
                strValue.Format("%d",var.lVal);
                break;
         case VT_R4:
                strValue.Format("%f",var.fltVal);
                break;
         case VT_R8:
                strValue.Format("%f",var.dblVal);
                break;
        case VT_CY:
                var_currency=var;
                strValue=var_currency.Format(0);
                break;
        case VT_BSTR:
                var_t=var;
                bst_t=var_t;
                strValue.Format ("%s",(const char*)bst_t);
                break;
        case VT_NULL:
                strValue=_T("");
                break;
        case VT_DATE:
                cur_time = (long)var.date;
                time_value=cur_time;
                strValue=time_value.Format("%A,%B%d,%Y");
                break;
        case VT_BOOL:
                strValue.Format("%d",var.boolVal );
                break;
                default: 
                strValue=_T("");
                break;
       }
       return strValue;

}
三、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. };

_bstr_t的使用方法

关于CString与VARIANT(CComVariant)之间的转化的更多相关文章

  1. javascript中日期格式与时间戳之间的转化

    日期格式与时间戳之间的转化 一:日期格式转化为时间戳 function timeTodate(date) { var new_str = date.replace(/:/g,'-'); new_str ...

  2. C#入门篇6-6:字符串操作 StringBiulder string char[]之间的转化

    //StringBiulder string char[]之间的转化 public static void Fun3() { StringBuilder sb = new StringBuilder( ...

  3. Android中Bitmap, Drawable, Byte,ID之间的转化

    Android中Bitmap, Drawable, Byte,ID之间的转化 1.  Bitmap 转化为 byte ByteArrayOutputStream out = new ByteArray ...

  4. NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化

    转载▼     在iOS  5 中,苹果引入了一个解析JSON串的NSJSONSerialization类. 通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化. ...

  5. 浅析mysql 共享表空间与独享表空间以及他们之间的转化

        innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.什么是共享表空间和独占表空间共 ...

  6. String和数字之间的转化

    主要是JDK的代码,还是比较的经典,值得一看,例如: package alg; /** * @author zha 字符串之间的转化 */ public class Alg3StringToint { ...

  7. json对象和json字符串之间的转化

    json对象和json字符串之间的转化 json字符串----->json对象 使用JSON.parse()函数 var jsonStr = '{"name":"z ...

  8. jQuery对象和DOM对象和字符串之间的转化

    jQuery对象和DOM对象和字符串之间的转化 字符串---------->jQuery对象 $(HTML字符串): $('<div>我是祖国的一朵小花</div>') ...

  9. json与javabean之间的转化

    接着上一个http://www.cnblogs.com/ya-qiang/p/9009134.html随笔,继续介绍json与java对象之间的转化 一.java普通对象和json字符串的互转 jav ...

随机推荐

  1. 浅析js绑定同一个事件依次触发问题系列(一)

    算了 还是上代码吧  记得写过这篇文章,但是找不到了(对,就是找不到了,算了再写一遍吧) 也是在群中有人问这个绑定不同事件 或者同一个事件的依次触发问题 个人建议如果是一个事件的话那么最好写成函数, ...

  2. ios错误ignoring file xxx missing required architecture x86_64 in file

    错误ignoring file xxx missing required architecture x86_64 in file 解决方法: 1.在Project target里“Architectu ...

  3. (转)linux设备驱动之USB数据传输分析 二

    3.2:控制传输过程1:root hub的控制传输在前面看到,对于root hub的情况,流程会转入rh_urb_enqueue().代码如下:static int rh_urb_enqueue (s ...

  4. WinForm开发----关闭window窗体最好的办法

    最近有一人问道,如何切换窗体.一想到这,我就想,不就是new一个form,然后就show么? 可是我发现,当你控制某个属性的时候,不是不能控制,只是很麻烦而已.有没有好的办法?当然有,咋办? 最简单最 ...

  5. Hive高级

    HiveServer2 概述: https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Overview2 客户端: https:// ...

  6. word2vec_basic.py

    ssh://sci@192.168.67.128:22/usr/bin/python3 -u /home/win_pymine_clean/feature_wifi/word2vec_basic.py ...

  7. SocketAsyncEventArgs里的AcceptSocket能独立存在吗?

    独立存在是什么意思? 先来看一个例子.我们知道一个Socket对象(我们叫他ListenScoket)可以调用AcceptAsync并接受一个SocketAsyncEventArgs对象,如果操作成功 ...

  8. ThoughtWorks(中国) 程序员读书雷达

    ThoughtWorks(中国)程序员读书雷达 软件业的特点是变化.若要提高软件开发的技能,就必须跟上技术发展的步伐.埋首醉心于项目开发与实战,固然能够锤炼自己的开发技巧,却难免受限于经验与学识.世界 ...

  9. sublime 快捷键,左菜单乱码

    sublime 快捷键安装 packagecontrol https://packagecontrol.io/installation#st3 import urllib.request,os,has ...

  10. 使用OpenSSL工具制作X.509证书的方法及其注意事项总结

    版权声明:本文为博主原创文章.转载请注明出处. https://blog.csdn.net/Ping_Fani07/article/details/21622545 怎样使用OpenSSL工具生成根证 ...