关于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內部結構
typedefstructtagVARIANT
{
VARTYPEvt;//存儲數據類型
unsignedshortwReserved1;
unsignedshortwReserved2;
unsignedshortwReserved3;
union
{
BytebVal;//VT_UI1.
ShortiVal;//VT_I2.
longlVal;//VT_I4.
floatfltVal;//VT_R4.
doubledblVal;//VT_R8.
VARIANT_BOOLboolVal;//VT_BOOL.
SCODEscode;//VT_ERROR.
CYcyVal;//VT_CY.
DATEdate;//VT_DATE.
BSTRbstrVal;//VT_BSTR.
DECIMALFAR*pdecVal//VT_BYREF|VT_DECIMAL.
IUnknownFAR*punkVal;//VT_UNKNOWN.
IDispatchFAR*pdispVal;//VT_DISPATCH.
SAFEARRAYFAR*parray;//VT_ARRAY|*.
ByteFAR*pbVal;//VT_BYREF|VT_UI1.
shortFAR*piVal;//VT_BYREF|VT_I2.
longFAR*plVal;//VT_BYREF|VT_I4.
floatFAR*pfltVal;//VT_BYREF|VT_R4.
doubleFAR*pdblVal;//VT_BYREF|VT_R8.
VARIANT_BOOLFAR*pboolVal;//VT_BYREF|VT_BOOL.
SCODEFAR*pscode;//VT_BYREF|VT_ERROR.
CYFAR*pcyVal;//VT_BYREF|VT_CY.
DATEFAR*pdate;//VT_BYREF|VT_DATE.
BSTRFAR*pbstrVal;//VT_BYREF|VT_BSTR.
IUnknownFAR*FAR*ppunkVal;//VT_BYREF|VT_UNKNOWN.
IDispatchFAR*FAR*ppdispVal;//VT_BYREF|VT_DISPATCH.
SAFEARRAYFAR*FAR*pparray;//VT_ARRAY|*.
VARIANTFAR*pvarVal;//VT_BYREF|VT_VARIANT.
voidFAR*byref;//GenericByRef.
charcVal;//VT_I1.
unsignedshortuiVal;//VT_UI2.
unsignedlongulVal;//VT_UI4.
intintVal;//VT_INT.
unsignedintuintVal;//VT_UINT.
charFAR*pcVal;//VT_BYREF|VT_I1.
unsignedshortFAR*puiVal;//VT_BYREF|VT_UI2.
unsignedlongFAR*pulVal;//VT_BYREF|VT_UI4.
intFAR*pintVal;//VT_BYREF|VT_INT.
unsignedintFAR*puintVal;//VT_BYREF|VT_UINT.
};
};
_bstr_t的使用方法
總結
以上是生活随笔為你收集整理的关于CString与VARIANT(CComVariant)之间的转化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac OS10.11更新ruby,ge
- 下一篇: Detectron2 keypoint_