**:
我們先看看com所支援的一些型別的基本類:
(微軟提供,在comdef.h中定義)
在com中使用的標準類class如下所示:
_bstr_t:對bstr型別進行打包,並提供有用的操作和方法;
_com_error:定義丟擲的error物件;
_com_ptr_t:封裝com介面指標
_variant_t:對variant型別進行打包,並提供有用的操作和方法;
一、_variant_t類的簡單介紹:
_variant_t物件封裝了variant資料型別。
(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是乙個結構體型別,我們可以看一下它的定義
[cpp]view plain
copy
print?
typedef
struct tagvariant
; };
typedef struct tagvariant
;};
注意:vt用來儲存內部變數(聯合體中儲存的變數)的型別,聯合體用來儲存對應型別的值
二、資料型別轉換
_bstr_t類可以作為_variant_t類與基本資料型別轉換的中介
(1) _variant_t與cstring之間的轉化
1> cstring轉換為_variant_t:
[cpp]view plain
copy
print?
cstring str;
_variant_t str1=(lpctstr)str;
cstring str;
_variant_t str1=(lpctstr)str;
使用_variant_t的成員函式setstring來對_variant_t的物件賦值會更好;
2> _variant_t轉換為cstring:
[cpp]view plain
copy
print?
_variant_t vt;
cstring tempstr=(lpcstr)_bstr_t(vt); //_bstr_t的建構函式有對_variant_t型別的處理
_variant_t vt;
cstring tempstr=(lpcstr)_bstr_t(vt); //_bstr_t的建構函式有對_variant_t型別的處理
(2) _variant_t與char *之間的轉換
1> char * 轉換為_variant_t
方法與cstring轉換為_variant_t的方法類似:
[cpp]view plain
copy
print?
char * cvalue;
_variant_t vvalue=(lpstr)cvalue;
char * cvalue;
_variant_t vvalue=(lpstr)cvalue;
2> _variant_t轉換為char *:
錯誤方法:
[cpp]view plain
copy
print?
_variant_t vvalue;
char * value=(lpstr)(lpcstr)_bstr_t(vvalue)
_variant_t vvalue;
char * value=(lpstr)(lpcstr)_bstr_t(vvalue)
value指向一堆亂碼...
原因:不能用char *直接指向(lpstr)(lpcstr)_bstr_t( _variant_t ),因為這樣轉換之後實際上是乙個string,而非乙個char *
正確方法:
進行轉換時,只能用strcpy(),將lpstr指向的字元複製到char * 所指向的記憶體中;
如下例:
[cpp]view plain
copy
print?
_variant_t vvalue;
char cvalue[16]=;
strcpy(cvalue, (lpcstr)_bstr_t(vvalue));
_variant_t vvalue;
char cvalue[16]=;
strcpy(cvalue, (lpcstr)_bstr_t(vvalue));
(3) 判斷_variant_t的值型別
下面的轉換**根據_variant_t的vt進行型別判斷,然後將資料值轉換為cstring型別(可作為轉換為其他資料型別的中介)
[cpp]view plain
copy
print?
cstring str;
//以下**演示如何轉換為c標準字串型
switch(var.vt)
case vt_i2: //var is short int type
case vt_i4: //var is long int type
case vt_r4: //var is float type
case vt_r8: //var is double type
case vt_cy: //var is cy type
case vt_date: //var is date type
case vt_bool: //var is variant_bool
default:
}
variant t 資料型別介紹
variant t的定義 comutil.h class variant t public tagvariant variant t 是乙個類,是 variant 的完全包裝類,它提供多種建構函式和資料轉換函式。它繼承自乙個結構體,其結構如下 struct tagvariant variant na...
variant t 資料型別介紹
variant t的定義 comutil.h cpp view plain copy print?class variant t public tagvariant variant t 是乙個類,是 variant 的完全包裝類,它提供多種建構函式和資料轉換函式。它繼承自乙個結構體,其結構如下 cp...
string與其他資料型別之間的轉換
c 封裝了一系列函式,使得string型別的資料能夠被方便地轉換到其他資料型別。這些函式名有著統一的風格,即stox string to x,x為要轉換到的型別名縮寫 函式名轉換到 stoi intstol long stoul unsigned long stoll long long stoul...