一、variant ,COleVariant,_variant_t三者的关于、区别、转换
1、variant
variant是C的一个结构体
VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。
换句话说,当你要处理不同类型的数据时,不可能提起知道到底要传输的是什么类型的数据,那么都可以用variant 封装起来,到用的时候,再判断类型.
看variant的定义,在OAIDl.h文件中,
typedef struct tagVARIANT VARIANT;
而tagVARIANT又是一个结构体:
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;
} ;
实际的应用,比如在项目中,我使用CMFCPropertyGridProperty展示数据,当我想获得一个Property的数据时,我是不知道将会得到什么样的数据的,int型?float型?char型?等等
那么我可以用VARIANT封装得到的数据,实际上CMFCPropertyGridProperty也是这么返回的,看CMFCPropertyGridProperty->GetValue(),
MSDN:
virtual const _variant_t& GetValue() const;
返回的就是一个_variant_t的东东。
那么_variant_t是什么呢?
2、_variant_t
_variant_t是一个用于COM的VARIANT类,看声明:(在comutil.h文件中)
class _variant_t : public ::tagVARIANT {
public:
// Constructors
//
_variant_t() throw();
_variant_t(const VARIANT& varSrc) ;
_variant_t(const VARIANT* pSrc) ;
_variant_t(const _variant_t& varSrc) ;
....
太长了,就不列了。
_variant_t很明显是对VARIANT的封装。
3、COleVariant
COleVariant类也是对VARIANT结构的封装,看声明:(在afxdisp.h文件中)
class COleVariant : public tagVARIANT
{
// Constructors
public:
COleVariant();
COleVariant(const VARIANT& varSrc);
COleVariant(LPCVARIANT pSrc);
COleVariant(const COleVariant& varSrc);
...太长了,不列了
4、那么COleVariant与_variant_t,这两者有什么区别呢?什么时候使用哪个呢?