使用VARIANT來(lái)傳遞參數(shù)意味著非強(qiáng)類(lèi)型語(yǔ)言(例如VBScript)能夠調(diào)用使用強(qiáng)類(lèi)型語(yǔ)言(C++)實(shí)現(xiàn)的方法。
VARIANT的結(jié)構(gòu)可以參考頭文件VC98/Include/OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。
VARIANT 數(shù)據(jù)類(lèi)型在文件OAIDL.IDL中定義如下:
struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { ULONGLONG ullVal; /* VT_UI8 */ LONGLONG llVal; /* VT_I8 */ LONG lVal; /* VT_I4 */ BYTE bVal; /* VT_UI1 */ SHORT iVal; /* VT_I2 */ FLOAT fltVal; /* VT_R4 */ DOUBLE dblVal; /* VT_R8 */ VARIANT_BOOL boolVal; /* VT_BOOL */ _VARIANT_BOOL bool; /* (obsolete) */ SCODE scode; /* VT_ERROR */ CY cyVal; /* VT_CY */ DATE date; /* VT_DATE */ BSTR bstrVal; /* VT_BSTR */ IUnknown * punkVal; /* VT_UNKNOWN */ IDispatch * pdispVal; /* VT_DISPATCH */ SAFEARRAY * parray; /* VT_ARRAY */ BYTE * pbVal; /* VT_BYREF|VT_UI1 */ SHORT * piVal; /* VT_BYREF|VT_I2 */ LONG * plVal; /* VT_BYREF|VT_I4 */ LONGLONG * pllVal; /* VT_BYREF|VT_I8 */ FLOAT * pfltVal; /* VT_BYREF|VT_R4 */ DOUBLE * pdblVal; /* VT_BYREF|VT_R8 */ VARIANT_BOOL *pboolVal; /* VT_BYREF|VT_BOOL */ _VARIANT_BOOL *pbool; /* (obsolete) */ SCODE * pscode; /* VT_BYREF|VT_ERROR */ CY * pcyVal; /* VT_BYREF|VT_CY */ DATE * pdate; /* VT_BYREF|VT_DATE */ BSTR * pbstrVal; /* VT_BYREF|VT_BSTR */ IUnknown ** ppunkVal; /* VT_BYREF|VT_UNKNOWN */ IDispatch ** ppdispVal; /* VT_BYREF|VT_DISPATCH */ SAFEARRAY ** pparray; /* VT_BYREF|VT_ARRAY */ VARIANT * pvarVal; /* VT_BYREF|VT_VARIANT */ PVOID byref; /* Generic ByRef */ CHAR cVal; /* VT_I1 */ USHORT uiVal; /* VT_UI2 */ ULONG ulVal; /* VT_UI4 */ INT intVal; /* VT_INT */ UINT uintVal; /* VT_UINT */ DECIMAL * pdecVal; /* VT_BYREF|VT_DECIMAL */ CHAR * pcVal; /* VT_BYREF|VT_I1 */ USHORT * puiVal; /* VT_BYREF|VT_UI2 */ ULONG * pulVal; /* VT_BYREF|VT_UI4 */ ULONGLONG * pullVal; /* VT_BYREF|VT_UI8 */ INT * pintVal; /* VT_BYREF|VT_INT */ UINT * puintVal; /* VT_BYREF|VT_UINT */ struct __tagBRECORD { PVOID pvRecord; IRecordInfo * pRecInfo; } __VARIANT_NAME_4; /* VT_RECORD */ } __VARIANT_NAME_3; } __VARIANT_NAME_2; DECIMAL decVal; } __VARIANT_NAME_1;}; VARIANT數(shù)據(jù)結(jié)構(gòu)包含兩個(gè)域(如果不考慮保留的域)。vt域描述了第二個(gè)域的數(shù)據(jù)類(lèi)型。為了使多種類(lèi)型能夠在第二個(gè)域中出現(xiàn),我們定義了一個(gè)聯(lián)合結(jié)構(gòu)。所以,第二個(gè)域的名稱(chēng)隨著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ù)類(lèi)型。常量VT_I4表明在第二個(gè)域中將出現(xiàn)一個(gè)long型的數(shù)據(jù)。根據(jù)類(lèi)型VARIANT的定義,可以得知,當(dāng)一個(gè)long型數(shù)據(jù)存入VARIANT類(lèi)型時(shí),其第二個(gè)域使用的名稱(chēng)是lVal。
新聞熱點(diǎn)
疑難解答