_variant_t

_variant_t是一個類,是VARIANT的完全包裝類,它提供多種構造函數和數據轉換函數。它繼承自一個結構體,其結構如下:

struct tagVARIANT
{
union
{
struct __tagVARIANT
{
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union
{
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
_VARIANT_BOOL bool;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown __RPC_FAR *punkVal;
IDispatch __RPC_FAR *pdispVal;
SAFEARRAY __RPC_FAR *parray;
BYTE __RPC_FAR *pbVal;
SHORT __RPC_FAR *piVal;
LONG __RPC_FAR *plVal;
FLOAT __RPC_FAR *pfltVal;
DOUBLE __RPC_FAR *pdblVal;
VARIANT_BOOL __RPC_FAR *pboolVal;
_VARIANT_BOOL __RPC_FAR *pbool;
SCODE __RPC_FAR *pscode;
CY __RPC_FAR *pcyVal;
DATE __RPC_FAR *pdate;
BSTR __RPC_FAR *pbstrVal;
IUnknown __RPC_FAR *__RPC_FAR *ppunkVal;
IDispatch __RPC_FAR *__RPC_FAR *ppdispVal;
SAFEARRAY __RPC_FAR *__RPC_FAR *pparray;
VARIANT __RPC_FAR *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
INT intVal;
UINT uintVal;
DECIMAL __RPC_FAR *pdecVal;
CHAR __RPC_FAR *pcVal;
USHORT __RPC_FAR *puiVal;
ULONG __RPC_FAR *pulVal;
INT __RPC_FAR *pintVal;
UINT __RPC_FAR *puintVal;
struct __tagBRECORD
{
PVOID pvRecord;
IRecordInfo __RPC_FAR *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
};
其中,vt表示的是_variant_t的數據類型,它的取值是以下枚舉結構的值:

enum VARENUM
{

VT_EMPTY = 0 [V] [P] nothing

VT_NULL =1 [V] [P] SQL style Null

VT_I2 =2 [V][T][P][S] 2 byte signed int

VT_I4 =3 [V][T][P][S] 4 byte signed int

VT_R4 = 4 [V][T][P][S] 4 byte real

VT_R8 = 5 [V][T][P][S] 8 byte real

VT_CY = 6 [V][T][P][S] currency

VT_DATE =7 [V][T][P][S] date

VT_BSTR =8 [V][T][P][S] OLE Automation string

VT_DISPATCH =9 [V][T][P][S] IDispatch *

VT_ERROR =10 [V][T][P][S] SCODE

VT_BOOL =11 [V][T][P][S] True=-1, False=0

VT_VARIANT =12 [V][T][P][S] VARIANT *

VT_UNKNOWN =13 [V][T] [S] IUnknown *

VT_DECIMAL =14 [V][T] [S] 16 byte fixed point

VT_RECORD =36 [V] [P][S] user defined type

VT_I1 = 16 [V][T][P][s] signed char

VT_UI1 =17 [V][T][P][S] unsigned char

VT_UI2 =18 [V][T][P][S] unsigned short

VT_UI4 =19 [V][T][P][S] unsigned short

VT_I8 =20 [T][P] signed 64-bit int

VT_UI8 =21 [T][P] unsigned 64-bit int

VT_INT =22 [V][T][P][S] signed machine int

VT_UINT =23 [V][T] [S] unsigned machine int

VT_VOID =24 [T] C style void

VT_HRESULT =25 [T] Standard return type

VT_PTR =26 [T] pointer type

VT_SAFEARRAY =27 [T] (use VT_ARRAY in VARIANT)

VT_CARRAY = 28 [T] C style array

VT_USERDEFINED =29 [T] user defined type

VT_LPSTR = 30 [T][P] null terminated string

VT_LPWSTR =31 [T][P] wide null terminated string

VT_FILETIME = 64 [P] FILETIME

VT_BLOB = 65 [P] Length prefixed bytes

VT_STREAM =66 [P] Name of the stream follows

VT_STORAGE =67 [P] Name of the storage follows

VT_STREAMED_OBJECT =68 [P] Stream contains an object

VT_STORED_OBJECT =69 [P] Storage contains an object

VT_BLOB_OBJECT =70 [P] Blob contains an object

VT_CF = 71 [P] Clipboard format

VT_CLSID =72 [P] A Class ID

VT_VECTOR = 0x1000 [P] simple counted array

VT_ARRAY = 0x2000 [V] SAFEARRAY*

VT_BYREF = 0x4000 [V] void* for local use

VT_BSTR_BLOB =0xfff Reserved for system use

VT_RESERVED = 0x8000,

VT_ILLEGAL = 0xffff,

VT_ILLEGALMASKED = 0xfff,

VT_TYPEMASK = 0xfff

};

例子:
_variant_t變量初始化調用的是_variant_t的構造函數,如果用一個int型的變量對數字類的變量進行初始化,會出錯,因爲_variant_t的構造函數中沒用用整型對其初始化的構造函數,可先將整型轉化成long對其進行初始化,賦值操作與構造函數類似,也可如下操作:

int a = 2000;

_variant_t var;
var.vt = VT_I2;

var.lVal = a;

對於沒有構造函數的數據類型都可以這樣賦值。

對於有構造函數的就可以直接利用構造函數賦值,例如:

long l=222;
_variant_t lVal(l);
 

 日期:

_variant_t str_val;

CString val;

 case VT_DATE:
        SYSTEMTIME systime;
        VariantTimeToSystemTime(str_val.date,&systime);
        val.Format("%02d-%02d-%02d %02d:%02d:%02d",systime.wYear,systime.wMonth,systime.wDay,systime.wHour,systime.wMinute,systime.wSecond);
        break;

發佈了32 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章