VARIANT 数据类型简单介绍

 

VIRIANTACTIVEX AUTOMATION需要用到的一种变量类型,可以称之为通用数据类型,其实它是一个结构。如果仅仅是调用ACTIVEX对象所提供的METHOD不需知道其中的细节。它仅用于通过IDISPATCH接口调用特定的METHOD或属性时用,VBVC已经将这一过程透明。换句话说,VC会自动转换简单数据类型。 关于下面的几个METHOD,例如OPENURL,在MFC中是:

 CStdioFile* OpenURL(

LPCTSTR pstrURL,

DWORD dwContext = 1,

DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII,

LPCTSTR pstrHeaders = NULL,

DWORD dwHeadersLength = 0

);
  Throw ( CInternetException );

VARIANT 数据类型在文件OAIDL.IDL中定义如下:

struct tagVARIANT {

    union {

        struct __tagVARIANT {

            VARTYPE vt;

            WORD    wReserved1;

            WORD    wReserved2;

            WORD    wReserved3;

            union {

                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       */

                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      */

                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数据结构包含两个域(如果不考虑保留的域)vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一行的注释形式给出。
    
使用VARIANTVARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如下代码:

long lValue = 999;
VARIANT vParam;
vParam.vt = VT_I4;
vParam.lVal = lValue;

在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal
     
使用VARIANT来传递参数意味着非强类型语言(例如VBScript)能够调用使用强类型语言(C++)实现的方法。Invoke()方法的实现可以检查参数VARIANT封装的数值是否符合其正确的数据类型。如果符合,该类型将取出,并传递给调用方法。否则,Invoke()方法能够尝试使用 VariantChangeType()API函数来将该数值转换成正确的类型。

posted on 2006-12-07 13:11  路吾  阅读(1622)  评论(0编辑  收藏  举报

导航