• 关于CString与VARIANT(CComVariant)之间的转化


    一、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的使用方法

  • 相关阅读:
    作业
    Day2
    Day1
    让Antd 的Modal 可以拖动
    JS日期处理——月末、季度末
    前端常见问题收录
    前端面试题收录
    使用ES6 Set类型 数组去重
    小程序开发:用Taro搭建框架
    JS 树形结构与数组结构相互转换、在树形结构中查找对象
  • 原文地址:https://www.cnblogs.com/zhuluqing/p/8718118.html
Copyright © 2020-2023  润新知