一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

_variant_t與其他數(shù)據(jù)類型的轉(zhuǎn)換

 dds885 2017-05-11
2012-04-24 09:53 18915人閱讀 評論(1) 收藏 舉報
 分類:

轉(zhuǎn)自:http://kuaixingdong.blog.hexun.com/29627840_d.html

我們先看看COM所支持的一些類型的基本類:

(微軟提供,在comdef.h中定義)

在COM中使用的標準類Class如下所示:

_bstr_t:對BSTR類型進行打包,并提供有用的操作和方法;

_com_error:定義拋出的error對象;

_com_ptr_t:封裝COM接口指針

_variant_t:對VARIANT類型進行打包,并提供有用的操作和方法;

一、_variant_t類的簡單介紹:

_variant_t對象封裝了VARIANT數(shù)據(jù)類型。

The class manages resource allocation and deallocation and makes function calls to VariantInit and VariantClear as appropriate.

(1) _variant類提供的方法:

1> 構(gòu)造函數(shù)

_variant_t

對_variant_t變量初始化調(diào)用的是_variant_t的構(gòu)造函數(shù)。我們一般習(xí)慣于用一個int型的變量對數(shù)字類的變量進行初始化,這對_variant_t變量是不允許的。

原因很簡單,_variant_t 的構(gòu)造函數(shù)中沒有用整型( Int )對其初始化的構(gòu)造函數(shù)

可先將整型轉(zhuǎn)化成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

賦值操作,給現(xiàn)有的_variant_t對象賦一個新值;

8> operator ==, !=

對比兩個 _variant_t 對象是否相等;

9> Extractors

Extract data from the encapsulated VARIANT object.

(2) _variant_t的定義:

_variant_t類封閉了VARIANT數(shù)據(jù)類型,VARIANT是一個結(jié)構(gòu)體類型,我們可以看一下它的定義

  1. typedef struct tagVARIANT   
  2. {  
  3.     VARTYPE vt;                             //存儲數(shù)據(jù)類型  
  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. };  
注意:vt用來存儲內(nèi)部變量(聯(lián)合體中保存的變量)的類型,聯(lián)合體用來存儲對應(yīng)類型的值

二、數(shù)據(jù)類型轉(zhuǎn)換

_bstr_t類可以作為_variant_t類與基本數(shù)據(jù)類型轉(zhuǎn)換的中介

(1) _variant_t與CString之間的轉(zhuǎn)化

1> CString轉(zhuǎn)換為_variant_t:

  1. CString str;  
  2. _variant_t str1=(LPCTSTR)str;   
使用_variant_t的成員函數(shù)SetString來對_variant_t的對象賦值會更好;

2> _variant_t轉(zhuǎn)換為CString:

  1. _variant_t vt;  
  2. CString tempstr=(LPCSTR)_bstr_t(vt);         //_bstr_t的構(gòu)造函數(shù)有對_variant_t類型的處理  

(2) _variant_t與char *之間的轉(zhuǎn)換

1> char * 轉(zhuǎn)換為_variant_t

方法與CString轉(zhuǎn)換為_variant_t的方法類似:

  1. char * cValue;  
  2. _variant_t vValue=(LPSTR)cValue;  
2> _variant_t轉(zhuǎn)換為char *:

錯誤方法:

  1. _variant_t vValue;  
  2. char * value=(LPSTR)(LPCSTR)_bstr_t(vValue)  

value指向一堆亂碼...

原因:不能用char *直接指向(LPSTR)(LPCSTR)_bstr_t( _variant_t ),因為這樣轉(zhuǎn)換之后實際上是一個string,而非一個char *

正確方法:

進行轉(zhuǎn)換時,只能用strcpy(),將LPSTR指向的字符復(fù)制到char * 所指向的內(nèi)存中;

如下例:

  1. _variant_t vValue;  
  2. char cValue[16]={0};  
  3. strcpy(cValue, (LPCSTR)_bstr_t(vValue));  

(3) 判斷_variant_t的值類型

下面的轉(zhuǎn)換代碼根據(jù)_variant_t的vt進行類型判斷,然后將數(shù)據(jù)值轉(zhuǎn)換為CString類型(可作為轉(zhuǎn)換為其他數(shù)據(jù)類型的中介)

  1. CString str;  
  2.   
  3. //以下代碼演示如何轉(zhuǎn)換為C標準字符串型  
  4. switch(var.vt)  
  5. {  
  6.     case VT_BSTR:  
  7.     {  
  8.         str=var.bstrVal;  
  9.         break;  
  10.     }  
  11.     case VT_I2: //var is short int type   
  12.     {  
  13.         str.Format("%d",(int)var.iVal);  
  14.         break;  
  15.     }  
  16.     case VT_I4: //var is long int type  
  17.     {  
  18.         str.Format("%d", var.lVal);  
  19.         break;  
  20.     }  
  21.     case VT_R4: //var is float type  
  22.     {  
  23.         str.Format("%10.6f", (double)var.fltVal);  
  24.         break;  
  25.     }  
  26.     case VT_R8: //var is double type  
  27.     {  
  28.         str.Format("%10.6f", var.dblVal);  
  29.         break;  
  30.     }  
  31.     case VT_CY: //var is CY type  
  32.     {  
  33.         str=COleCurrency(var).Format();  
  34.         break;  
  35.     }  
  36.     case VT_DATE: //var is DATE type  
  37.     {  
  38.         str=COleDateTime(var).Format();  
  39.         break;  
  40.     }  
  41.     case VT_BOOL: //var is VARIANT_BOOL  
  42.     {  
  43.         str= (var.boolVal==0) ?"FALSE""TRUE";  
  44.         break;  
  45.     }  
  46.     default:  
  47.     {  
  48.         str.Format("Unk type %d\n",var.vt);  
  49.         TRACE("Unknown type %d\n",var.vt);  
  50.         break;  
  51.     }  
  52. }  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    草草夜色精品国产噜噜竹菊| 国产又粗又长又大高潮视频| 国产欧美日韩在线精品一二区| 国产成人人人97超碰熟女| 亚洲视频一区自拍偷拍另类| 国产一区欧美一区日韩一区| 伊人久久五月天综合网| 日韩国产亚洲一区二区三区| 91精品国产品国语在线不卡| 最新午夜福利视频偷拍| 五月天六月激情联盟网| 尹人大香蕉中文在线播放| 中文字幕久久精品亚洲乱码| 日韩中文字幕人妻精品| 国产小青蛙全集免费看| 麻豆看片麻豆免费视频| 91亚洲精品亚洲国产| 久久精品国产亚洲熟女| 婷婷色网视频在线播放| 欧美一区二区三区99| 日韩免费av一区二区三区| 高清亚洲精品中文字幕乱码| 中文字幕一区二区熟女| 亚洲综合伊人五月天中文| 成人欧美一区二区三区视频| 久久99精品日韩人妻| 久久精品国产亚洲熟女| 日韩精品一区二区三区四区| 又黄又爽禁片视频在线观看| 欧美性欧美一区二区三区| 中文字幕精品一区二区三| 国产一区二区三区香蕉av| 国产又粗又黄又爽又硬的| 日本熟女中文字幕一区| 欧美一级片日韩一级片| 夜色福利久久精品福利| 好吊日在线视频免费观看| 国产又粗又硬又大又爽的视频| 成年午夜在线免费视频| 爱在午夜降临前在线观看| 中文字幕乱码免费人妻av|