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

Posted moisiet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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的使用方法

以上是关于关于CString与VARIANT(CComVariant)之间的转化的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中带有 const 参数的 std::variant

关于VBA中数组的一些问题

关于MFC程序中CString转char*与char*转CString的几个问题

如何将 std::variant 作为 VARIANT* 传递给 ExecWB?

CComVariant 与 _variant_t、CComBSTR 与 _bstr_t

关于使用_bstr_t的一个坑