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

时间:2024-10-12 13:05:37

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