MSDN中关于VARTYPE的定义如下,我不太明白哦,这里不是将VARTYPE定义为unsigned short,怎么又跟下面的VARENUM关联起来了?
还有,对VARIANT的定义中,typedef struct tagVARIANT  {};是什么意思啊,怎么跟typedef struct FARSTRUCT tagVARIANT VARIANT; 联系起来。也不太明白vt与联合体的关系。
我是个新手啊,还请各位大侠指点指点呐,小弟谢过typedef unsigned short VARTYPE;
enum VARENUM{
    VT_EMPTY        = 0,            // Not specified.
    VT_NULL        = 1,            // Null.
    VT_I2        = 2,            // 2-byte signed int.
    VT_I4        = 3,            // 4-byte signed int.
    VT_R4        = 4,            // 4-byte real.
    VT_R8        = 5,            // 8-byte real.
    VT_CY        = 6,            // Currency.
    VT_DATE        = 7,            // Date.
    VT_BSTR        = 8,            // Binary string.
    VT_DISPATCH    = 9,            // IDispatch
    VT_ERROR        = 10,            // Scodes.
    VT_BOOL        = 11,            // Boolean; True=-1, False=0.
    VT_VARIANT    = 12,            // VARIANT FAR*.
    VT_UNKNOWN  = 13,            // IUnknown FAR*.
    VT_UI1        = 17,            // Unsigned char.    // Other constants that are not valid in VARIANTs omitted here.};
typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;typedef struct tagVARIANT  {
    VARTYPE vt;
    unsigned short wReserved1;
    unsigned short wReserved2;
    unsigned short wReserved3;
    union {
        unsigned char        bVal;                        // VT_UI1.
        short                    iVal;                        // VT_I2    .
        long                    lVal;                        // VT_I4    .
        float                    fltVal;                    // VT_R4    .
        double                dblVal;                    // VT_R8    .
        VARIANT_BOOL        boolVal;                        // VT_BOOL.
        SCODE                    scode;                    // VT_ERROR.
        CY                        cyVal;                    // VT_CY    .
        DATE                    date;                        // VT_DATE.
        BSTR                    bstrVal;                    // VT_BSTR.
        IUnknown                FAR* punkVal;            // VT_UNKNOWN.
        IDispatch             FAR* pdispVal;            // VT_DISPATCH.
        SAFEARRAY            FAR* parray;            // VT_ARRAY|*.
        unsigned char        FAR* pbVal;                // VT_BYREF|VT_UI1.
        short                    FAR* piVal;                // VT_BYREF|VT_I2.
        long                    FAR* plVal;                // VT_BYREF|VT_I4.
        float                    FAR* pfltVal;            // VT_BYREF|VT_R4.
        double                FAR* pdblVal;            // VT_BYREF|VT_R8.
        VARIANT_BOOL        FAR* pboolVal;                // VT_BYREF|VT_BOOL.
        SCODE                    FAR* pscode;            // VT_BYREF|VT_ERROR.
        CY                        FAR* pcyVal;            // VT_BYREF|VT_CY.
        DATE                    FAR* pdate;                // VT_BYREF|VT_DATE.
        BSTR                    FAR* pbstrVal;            // VT_BYREF|VT_BSTR.
        IUnknown FAR*        FAR* ppunkVal;            // VT_BYREF|VT_UNKNOWN.
        IDispatch FAR*        FAR* ppdispVal;        // VT_BYREF|VT_DISPATCH.
        SAFEARRAY FAR*        FAR* pparray;            // VT_ARRAY|*.
        VARIANT                FAR* pvarVal;            // VT_BYREF|VT_VARIANT.
        void                    FAR* byref;                // Generic ByRef.
    };
};

解决方案 »

  1.   

    vt与联合体的关系,看代码:
            SAFEARRAY* psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = nLength;
    psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
    for (long i = 0; i < nLength; i++)
    SafeArrayPutElement (psa, &i, pBufEx++);
    VARIANT varBLOB; //定义对象
    varBLOB.vt = VT_ARRAY | VT_UI1;//给出数据的类型,用枚举类可以减少错误
    varBLOB.parray = psa;//数据保存在这里
              //所谓union,就是其中的数据类型,你代码中可以任选一种,编译时,
              //就按该类型来分配内存空间  
              //这里是parray,是一个指向数组的指针。
      
    typedef struct tagVARIANT {};是说tagVARIANT相当于:struct{  VARTYPE vt;
      unsigned short wReserved1;
      unsigned short wReserved2;
      unsigned short wReserved3;
      union {
      unsigned char bVal; // VT_UI1.
      short iVal; // VT_I2 .
      long lVal; // VT_I4 .
      .......}typedef struct FARSTRUCT tagVARIANT VARIANT;
    //VARIANT 相当于 struct FARSTRUCT tagVARIANT 
    //就是用 tagVARIANT 来定义 VARIANT
    //我们最终用 VARIANT
     
      

  2.   

    谢谢#1楼的回答啊,我还有个问题啊
    typedef struct tagPoint
    {
    ...
    }Point;
    这个我可以理解,就是定义个同义的Point;
    但是
    typedef struct tagVARIANT
    {
    ...
    };
    这种用法是什么意思,貌似还是不太懂哦,能否给我讲一下?
      

  3.   

    typedef struct tagPoint
    {
    ...
    }Point;
    中tagPoint是struct名,Point是typedef给予的别名。typedef struct //省略tagPoint是可以的
    {
    ...
    }Point;
    typedef struct tagVARIANT { };
    看起来象是:
    typedef struct tagPoint
    {
    ...
    };//省掉了Point那么这里typedef似乎是多余的,为什么不直接这样定义:struct tagVARIANT { };我也不知何故。