首页 / 软件开发 / C++ / 变体(Variant)与Dispatch调用(IDispatch)
变体(Variant)与Dispatch调用(IDispatch)2011-04-21 csdn博客 许式伟变体(Variant)Variant类型理论上可以存放任何类型的数据,这也是中文很多 人称之为“变体”的原因。对于C++这种强类型语言的程序员来说,存在变体 (Variant)这样的类型是奇怪的。但是对于哪些淡化类型概念的语言(如Visual Basic等) 来说,Variant是它们默认的类型。在VB中,如果没有用As语句声明变量,那么这个变量就是 Variant类型的。对于C++程序员来说,Variant不过是一个超复杂的结构体:typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;
struct tagVARIANT
{
union
{
struct __tagVARIANT
{
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union
{
LONGLONG llVal;
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 *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
_VARIANT_BOOL *pbool;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct __tagBRECORD
{
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} ;
Variant类型在解释型语言和脚本语言中应用甚广。在Visual Basic,JavaScript等身上,处处可见其身影。但是如果没有语言本省的支持,对Variant操 作是复杂的。不幸的是,C/C++就是属于这种情况。这应该说与C++对新技术的慎重,以及是 一种非纯商业公司控制的语言有关。其他语言如Delphi,一定要与时俱进,是一定要加 Variant的内置支持的。