我們先看看COM所支持的一些類型的基本類:
(微軟提供,在comdef.h中定義)
在COM中使用的標准類Class如下所示:
_bstr_t:對BSTR類型進行打包,並提供有用的操作和方法;
_com_error:定義拋出的error對象;
_com_ptr_t:封裝COM接口指針
_variant_t:對VARIANT類型進行打包,並提供有用的操作和方法;
一、_variant_t類的簡單介紹:
_variant_t對象封裝了VARIANT數據類型。
The class manages resource allocation and deallocation and makes function calls to VariantInit and VariantClear as appropriate.
(1) _variant類提供的方法:
1> 構造函數
_variant_t
對_variant_t變量初始化調用的是_variant_t的構造函數。我們一般習慣於用一個int型的變量對數字類的變量進行初始化,這對_variant_t變量是不允許的。
原因很簡單,_variant_t 的構造函數中沒有用整型( Int )對其初始化的構造函數
可先將整型轉化成long,然后再對其進行初始化
2> Attach()
Attaches a VARIANT object into the _variant_t object.
3> Clear()
Clears the encapsulated VARIANT object.
4> ChangeType
Changes the type of the _variant_t object to the indicated VARTYPE.
5> Detach
Detaches the encapsulated VARIANT object from this _variant_t object.
6> SetString
將一個string賦值給_variant_t對象;
7> Operators
賦值操作,給現有的_variant_t對象賦一個新值;
8> operator ==, !=
對比兩個 _variant_t 對象是否相等;
9> Extractors
Extract data from the encapsulated VARIANT object.
(2) _variant_t的定義:
_variant_t類封閉了VARIANT數據類型,VARIANT是一個結構體類型,我們可以看一下它的定義
注意:vt用來存儲內部變量(聯合體中保存的變量)的類型,聯合體用來存儲對應類型的值
二、數據類型轉換
_bstr_t類可以作為_variant_t類與基本數據類型轉換的中介
(1) _variant_t與CString之間的轉化
1> CString轉換為_variant_t:
使用_variant_t的成員函數SetString來對_variant_t的對象賦值會更好;
2> _variant_t轉換為CString:
_variant_t vt; CString tempstr=(LPCSTR)_bstr_t(vt); //_bstr_t的構造函數有對_variant_t類型的處理
(2) _variant_t與char *之間的轉換
1> char * 轉換為_variant_t
方法與CString轉換為_variant_t的方法類似:
char * cValue; _variant_t vValue=(LPSTR)cValue;
2> _variant_t轉換為char *:
錯誤方法:
_variant_t vValue; char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)
value指向一堆亂碼...
原因:不能用char *直接指向(LPSTR)(LPCSTR)_bstr_t( _variant_t ),因為這樣轉換之后實際上是一個string,而非一個char *
正確方法:
進行轉換時,只能用strcpy(),將LPSTR指向的字符復制到char * 所指向的內存中;
如下例:
_variant_t vValue; char cValue[16]={0}; strcpy(cValue, (LPCSTR)_bstr_t(vValue));
(3) 判斷_variant_t的值類型
下面的轉換代碼根據_variant_t的vt進行類型判斷,然后將數據值轉換為CString類型(可作為轉換為其他數據類型的中介)
CString str; //以下代碼演示如何轉換為C標准字符串型 switch(var.vt) { case VT_BSTR: { str=var.bstrVal; break; } case VT_I2: //var is short int type { str.Format("%d",(int)var.iVal); break; } case VT_I4: //var is long int type { str.Format("%d", var.lVal); break; } case VT_R4: //var is float type { str.Format("%10.6f", (double)var.fltVal); break; } case VT_R8: //var is double type { str.Format("%10.6f", var.dblVal); break; } case VT_CY: //var is CY type { str=COleCurrency(var).Format(); break; } case VT_DATE: //var is DATE type { str=COleDateTime(var).Format(); break; } case VT_BOOL: //var is VARIANT_BOOL { str= (var.boolVal==0) ?"FALSE": "TRUE"; break; } default: { str.Format("Unk type %d\n",var.vt); TRACE("Unknown type %d\n",var.vt); break; } }