C++變體數(shù)據(jù)類型—— VARIANT_第1頁
C++變體數(shù)據(jù)類型—— VARIANT_第2頁
C++變體數(shù)據(jù)類型—— VARIANT_第3頁
C++變體數(shù)據(jù)類型—— VARIANT_第4頁
C++變體數(shù)據(jù)類型—— VARIANT_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C+變體數(shù)據(jù)類型 VARIANT-zz: 2009-10-20 15:413601人閱讀評(píng)論(0)收藏舉報(bào)版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。百度百科:Variant音標(biāo) Phonetic symbol詞性及解釋 Part of speech and definationn. 變體, 異體a. 不同的, 有差別的【計(jì)】 變體型【化】 變體【醫(yī)】 變異的; 變異體, 變型, 變種Variant 數(shù)據(jù)類型是所有沒被顯式聲明(用如 Dim、Private、Public 或 Static等語句)為其他類型變量的數(shù)據(jù)類型。Variant 數(shù)據(jù)類型并沒有類型聲明字符。Variant 是一種

2、特殊的數(shù)據(jù)類型,除了定長(zhǎng) String 數(shù)據(jù)及用戶定義類型外,可以包含任何種類的數(shù)據(jù)。Variant 也可以包含 Empty、Error、Nothing 及 Null等特殊值??梢杂?VarType 函數(shù)或 TypeName 函數(shù)來決定如何處理 Variant 中的數(shù)據(jù)。數(shù)值數(shù)據(jù)可以是任何整型或?qū)嵭蛿?shù),負(fù)數(shù)時(shí)范圍從 -1.797693134862315E308 到 -4.94066E-324,正數(shù)時(shí)則從 4.94066E-324 到 1.797693134862315E308。通常,數(shù)值Variant 數(shù)據(jù)保持為其 Variant 中原來的數(shù)據(jù)類型。例如,如果把一個(gè) Integer賦值給 Va

3、riant,則接下來的運(yùn)算會(huì)把此 Variant 當(dāng)成 Integer 來處理。然而,如果算術(shù)運(yùn)算針對(duì)含 Byte、Integer、Long 或 Single 之一的Variant 執(zhí)行,并當(dāng)結(jié)果超過原來數(shù)據(jù)類型的正常范圍時(shí),則在 Variant 中的結(jié)果會(huì)提升到較大的數(shù)據(jù)類型。如 Byte 則提升到 Integer,Integer 則提升到 Long,而 Long和Single 則提升為 Double。當(dāng) Variant 變量中有 Currency、Decimal 及 Double 值超過它們各自的范圍時(shí),會(huì)發(fā)生錯(cuò)誤??梢杂?Variant 數(shù)據(jù)類型來替換任何數(shù)據(jù)類型,這樣會(huì)更有適應(yīng)性。如果

4、 Variant 變量的內(nèi)容是數(shù)字,它可以用字符串來表示數(shù)字或是用它實(shí)際的值來表示,這將由上下文來決定,例如:Dim MyVar As VariantMyVar = 98052在前面的例子中,MyVar 內(nèi)有一實(shí)際值為 98052 的數(shù)值。像期望的那樣,算術(shù)運(yùn)算子可以對(duì) Variant 變量運(yùn)算,其中包含數(shù)值或能被解釋為數(shù)值的字符串?dāng)?shù)據(jù)。如果用 + 運(yùn)算子來將 MyVar 與其他含有數(shù)字的 Variant 或數(shù)值類型的變量相加,結(jié)果便是一算術(shù)和。Empty 值用來標(biāo)記尚未初始化(給定初始值)的Variant 變量。內(nèi)含 Empty 的 Variant 在數(shù)值的上下文中表示 0,如果是用在字符串

5、的上下文中則表示零長(zhǎng)度的字符串 ()。不應(yīng)將 Empty 與 Null 弄混。Null 是表示 Variant 變量確實(shí)含有一個(gè)無效數(shù)據(jù)。在 Variant 中,Error 是用來指示在過程中出現(xiàn)錯(cuò)誤時(shí)的特殊值。然而,不像對(duì)其他種類的錯(cuò)誤那樣,程序并不產(chǎn)生普通的應(yīng)用程序級(jí)的錯(cuò)誤處理。這可以讓程序員,或應(yīng)用程序本身,根據(jù)此錯(cuò)誤值采取另外的行動(dòng)??梢杂?CVErr 函數(shù)將實(shí)數(shù)轉(zhuǎn)換為錯(cuò)誤值來產(chǎn)生 Error 值。變體類型Variant變體類型Variant,能夠在運(yùn)行期間動(dòng)態(tài)的改變類型。變體類型能支持所有簡(jiǎn)單的數(shù)據(jù)類型,如整型、浮點(diǎn)、字符串、布爾型、日期時(shí)間、貨幣及OLE自動(dòng)化對(duì)象等,不能夠表達(dá)Ob

6、ject Pascal對(duì)象。VARIANT 數(shù)據(jù)類型在文件OAIDL.IDL中定義如下:1. structtagVARIANT2. union3. struct_tagVARIANT4. VARTYPEvt;5. WORDwReserved1;6. WORDwReserved2;7. WORDwReserved3;8. union9. ULONGLONGullVal;/*VT_UI8*/10. LONGLONGllVal;/*VT_I8*/11. LONGlVal;/*VT_I4*/12. BYTEbVal;/*VT_UI1*/13. SHORTiVal;/*VT_I2*/14. FLOATf

7、ltVal;/*VT_R4*/15. DOUBLEdblVal;/*VT_R8*/16. VARIANT_BOOLboolVal;/*VT_BOOL*/17. _VARIANT_BOOLbool;/*(obsolete)*/18. SCODEscode;/*VT_ERROR*/19. CYcyVal;/*VT_CY*/20. DATEdate;/*VT_DATE*/21. BSTRbstrVal;/*VT_BSTR*/22. IUnknown*punkVal;/*VT_UNKNOWN*/23. IDispatch*pdispVal;/*VT_DISPATCH*/24. SAFEARRAY*pa

8、rray;/*VT_ARRAY*/25. BYTE*pbVal;/*VT_BYREF|VT_UI1*/26. SHORT*piVal;/*VT_BYREF|VT_I2*/27. LONG*plVal;/*VT_BYREF|VT_I4*/28. LONGLONG*pllVal;/*VT_BYREF|VT_I8*/29. FLOAT*pfltVal;/*VT_BYREF|VT_R4*/30. DOUBLE*pdblVal;/*VT_BYREF|VT_R8*/31. VARIANT_BOOL*pboolVal;/*VT_BYREF|VT_BOOL*/32. _VARIANT_BOOL*pbool;/

9、*(obsolete)*/33. SCODE*pscode;/*VT_BYREF|VT_ERROR*/34. CY*pcyVal;/*VT_BYREF|VT_CY*/35. DATE*pdate;/*VT_BYREF|VT_DATE*/36. BSTR*pbstrVal;/*VT_BYREF|VT_BSTR*/37. IUnknown*ppunkVal;/*VT_BYREF|VT_UNKNOWN*/38. IDispatch*ppdispVal;/*VT_BYREF|VT_DISPATCH*/39. SAFEARRAY*pparray;/*VT_BYREF|VT_ARRAY*/40. VARI

10、ANT*pvarVal;/*VT_BYREF|VT_VARIANT*/41. PVOIDbyref;/*GenericByRef*/42. CHARcVal;/*VT_I1*/43. USHORTuiVal;/*VT_UI2*/44. ULONGulVal;/*VT_UI4*/45. INTintVal;/*VT_INT*/46. UINTuintVal;/*VT_UINT*/47. DECIMAL*pdecVal;/*VT_BYREF|VT_DECIMAL*/48. CHAR*pcVal;/*VT_BYREF|VT_I1*/49. USHORT*puiVal;/*VT_BYREF|VT_UI

11、2*/50. ULONG*pulVal;/*VT_BYREF|VT_UI4*/51. ULONGLONG*pullVal;/*VT_BYREF|VT_UI8*/52. INT*pintVal;/*VT_BYREF|VT_INT*/53. UINT*puintVal;/*VT_BYREF|VT_UINT*/54. struct_tagBRECORD55. PVOIDpvRecord;56. IRecordInfo*pRecInfo;57. _VARIANT_NAME_4;/*VT_RECORD*/58. _VARIANT_NAME_3;59. _VARIANT_NAME_2;60. 61. DE

12、CIMALdecVal;62. _VARIANT_NAME_1;63. ;VARIANT數(shù)據(jù)結(jié)構(gòu)包含兩個(gè)域(如果不考慮保留的域)。vt域描述了第二個(gè)域的數(shù)據(jù)類型。為了使多種類型能夠在第二個(gè)域中出現(xiàn),我們定義了一個(gè)聯(lián)合結(jié)構(gòu)。所以,第二個(gè)域的名稱隨著vt域中輸入值的不同而改變。用于指定vt域值情況的常量在聯(lián)合的定義中以每一行的注釋形式給出。使用VARIANT和VARIANTARG數(shù)據(jù)結(jié)構(gòu)要分兩步完全。舉一個(gè)例子,讓我們考慮如下代碼:long lValue = 999;VARIANT vParam;vParam.vt = VT_I4;vParam.lVal = lValue;在第一行中指定數(shù)據(jù)類型。

13、常量VT_I4表明在第二個(gè)域中將出現(xiàn)一個(gè)long型的數(shù)據(jù)。根據(jù)類型VARIANT的定義,可以得知,當(dāng)一個(gè)long型數(shù)據(jù)存入VARIANT類型時(shí),其第二個(gè)域使用的名稱是lVal。使用VARIANT來傳遞參數(shù)意味著非強(qiáng)類型語言(例如VBScript)能夠調(diào)用使用強(qiáng)類型語言(C+)實(shí)現(xiàn)的方法。Invoke()方法的實(shí)現(xiàn)可以檢查參數(shù)VARIANT封裝的數(shù)值是否符合其正確的數(shù)據(jù)類型。如果符合,該類型將取出,并傳遞給調(diào)用方法。否則,Invoke()方法能夠嘗試使用 VariantChangeType()API函數(shù)來將該數(shù)值轉(zhuǎn)換成正確的類型。typedef unsigned short VARTYPE;/*

14、 VARENUM usage key,* * V - may appear in a VARIANT* * T - may appear in a TYPEDESC* * P - may appear in an OLE property set* * S - may appear in a Safe Array* VT_EMPTY V P nothing* VT_NULL V P SQL style Null* VT_I2 VTPS 2 byte signed int* VT_I4 VTPS 4 byte signed int* VT_R4 VTPS 4 byte real* VT_R8 V

15、TPS 8 byte real* VT_CY VTPS currency* VT_DATE VTPS date* VT_BSTR VTPS OLE Automation string* VT_DISPATCH VT S IDispatch * VT_ERROR VTPS SCODE* VT_BOOL VTPS True=-1, False=0* VT_VARIANT VTPS VARIANT * VT_UNKNOWN VT S IUnknown * VT_DECIMAL VT S 16 byte fixed point* VT_RECORD V PS user defined type* VT

16、_I1 VTPs signed char* VT_UI1 VTPS unsigned char* VT_UI2 VTPS unsigned short* VT_UI4 VTPS unsigned long* VT_I8 TP signed 64-bit int* VT_UI8 TP unsigned 64-bit int* VT_INT VTPS signed machine int* VT_UINT VT S unsigned machine int* VT_INT_PTR T signed machine register size width* VT_UINT_PTR T unsigne

17、d machine register size width* VT_VOID T C style void* VT_HRESULT T Standard return type* VT_PTR T pointer type* VT_SAFEARRAY T (use VT_ARRAY in VARIANT)* VT_CARRAY T C style array* VT_USERDEFINED T user defined type* VT_LPSTR TP null terminated string* VT_LPWSTR TP wide null terminated string* VT_F

18、ILETIME P FILETIME* VT_BLOB P Length prefixed bytes* VT_STREAM P Name of the stream follows* VT_STORAGE P Name of the storage follows* VT_STREAMED_OBJECT P Stream contains an object* VT_STORED_OBJECT P Storage contains an object* VT_VERSIONED_STREAM P Stream with a GUID version* VT_BLOB_OBJECT P Blo

19、b contains an object* VT_CF P Clipboard format* VT_CLSID P A Class ID* VT_VECTOR P simple counted array* VT_ARRAY V SAFEARRAY* VT_BYREF V void* for local use* VT_BSTR_BLOB Reserved for system use*/enum VARENUM VT_EMPTY= 0,VT_NULL= 1,VT_I2= 2,VT_I4= 3,VT_R4= 4,VT_R8= 5,VT_CY= 6,VT_DATE= 7,VT_BSTR= 8,

20、VT_DISPATCH= 9,VT_ERROR= 10,VT_BOOL= 11,VT_VARIANT= 12,VT_UNKNOWN= 13,VT_DECIMAL= 14,VT_I1= 16,VT_UI1= 17,VT_UI2= 18,VT_UI4= 19,VT_I8= 20,VT_UI8= 21,VT_INT= 22,VT_UINT= 23,VT_VOID= 24,VT_HRESULT= 25,VT_PTR= 26,VT_SAFEARRAY= 27,VT_CARRAY= 28,VT_USERDEFINED= 29,VT_LPSTR= 30,VT_LPWSTR= 31,VT_RECORD= 36,VT_INT_PTR= 37,VT_UINT_PTR= 38,VT_FILETIME= 64,VT_BLOB= 65,VT_STREAM= 66,VT_STORAGE= 67,VT_STREAMED_OBJECT= 68,VT_STORED_OBJECT= 69,VT_BLOB_OBJ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論