一、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. windows svchost.exe 引起的出现的莫名其妙的窗口失去焦点

    我不知道你们遇到没,反正我是遇到了,现在我就把解决方法给你们,当然都是从网上整理下来的 这个失去焦点可以分为两种,一种是病毒,一种是系统自带的问题 首先你得知道自己的窗口被什么给挤掉了焦点 先看看这篇 ...

  2. UVa 10651 Pebble Solitaire(DP 记忆化搜索)

    Pebble Solitaire Pebble solitaire is an interesting game. This is a game where you are given a board ...

  3. No breeds found in the signature, a signature update is recommended

    cobbler 2.6.11 遇到这个问题,需要 >> cobbler signature update >> and cobblerd restart 转自: https:/ ...

  4. 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法

    OS js oc相互调用(JavaScriptCore)   接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...

  5. Android创建library工程

    本文着重介绍如何创建Android library,并且在工程中使用此library提供的资源,具体步骤如下:1. 创建一个Android工程,命名为sourceProj2. 右键--properti ...

  6. php之 人员的权限管理

    1.想好权限管理的作用? 2.有什么权限内容? 3.既然有权限管理那么就会有管理员? 4.登录后每个人员的界面会是不一样的? 一.想好这个权限是什么? 就做一个就像是vip的功能,普通用户和vip用户 ...

  7. Pell方程(求形如x*x-d*y*y=1的通解。)

    佩尔方程x*x-d*y*y=1,当d不为完全平方数时,有无数个解,并且知道一个解可以推其他解. 如果d为完全平方数时,可知佩尔方程无解. 假设(x0,y0)是最小正整数解. 则: xn=xn-1*x0 ...

  8. nginx学习之详细安装篇(二)

    1. 选择稳定版还是主线版 主线版:包含最新的功能和bug修复,但该版本可能会含有一些属于实验性的模块,同时可能会有新的bug,所以如果只是做测试使用,可以使用主线版. 稳定版:不包含最新的功能,但修 ...

  9. sqlserver删除所有表

    --/第1步**********删除所有表的外键约束*************************/ DECLARE c1 cursor for select 'alter table ['+ o ...

  10. 【基于rssi室内定位报告】rssi分布情况标识位置

    import matplotlib matplotlib.use('Agg') import numpy as np from numpy import array from matplotlib i ...