variant t與其他資料型別的轉換

2021-06-22 03:58:16 字數 3807 閱讀 8161

**:

我們先看看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...