谁能谈一谈VARIANT and VARIANTARG就VARIANT and VARIANTARG各自的含义,不同,及其用途,按自己理解的意思,畅所欲言一番。

解决方案 »

  1.   

    VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。 
    对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: 
    VARIANT va; 
    int a=2001; 
    va.vt=VT_I4;///指明整型数据 
    va.lVal=a; ///赋值 对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: VARIANT FAR* pvarVal VT_BYREF|VT_VARIANT 
    void FAR*          byref VT_BYREF 
    DECIMAL FAR* pdecVal VT_BYREF|VT_DECIMAL
    VARIANT_BOOL boolVal VT_BOOL 
    VARIANT_BOOL FAR*          pboolVal          VT_BYREF|VT_BOOL 
    SCODE scode VT_ERROR 
    SCODE FAR* pscode VT_BYREF|VT_ERROR 
    CY cyVal VT_CY 
    CY FAR* pcyVal VT_BYREF|VT_CY 
    DATE date VT_DATE 
    DATE FAR*          pdate VT_BYREF|VT_DATE 
    BSTR bstrVal VT_BSTR 
    BSTR FAR*          pbstrVal          VT_BYREF|VT_BSTR 
    IUnknown FAR* punkVal VT_UNKNOWN 
    IUnknown FAR* FAR*          ppunkVal          VT_BYREF|VT_UNKNOWN 
    IDispatch FAR* pdispVal          VT_DISPATCH 
    IDispatch FAR* FAR* ppdispVal          VT_BYREF|VT_DISPATCH 
    SAFEARRAY FAR* parray VT_ARRAY|* 
    SAFEARRAY FAR* FAR* pparray VT_ARRAY|* 
    char                       cVal VT_I1
    char FAR*          pcVal VT_BYREF|VT_I1
    unsigned char bVal VT_UI1 
    unsigned char FAR*          pbVal VT_BYREF|VT_UI1 
    short iVal VT_I2 
    short FAR* piVal VT_BYREF|VT_I2 
    unsigned short             uiVal VT_UI2
    unsigned short FAR* puiVal VT_BYREF|VT_UI2
    long lVal VT_I4   
    long FAR*          plVal VT_BYREF|VT_I4 
    unsigned long              ulVal VT_UI4
    unsigned long FAR*   pulVal VT_BYREF|VT_UI4
    int                        intVal VT_INT
    int FAR*          pintVal VT_BYREF|VT_INT
    unsigned int uintVal VT_UINT
    unsigned int FAR*          puintVal          VT_BYREF|VT_UINT
    float fltVal VT_R4 
    float FAR* pfltVal VT_BYREF|VT_R4 
    double dblVal VT_R8   
    double FAR* pdblVal VT_BYREF|VT_R8
      

  2.   

    摘自MSDN:
    Use VARIANTARG to describe arguments passed within DISPPARAMS, and VARIANT to specify variant data that cannot be passed by reference. When a variant refers to another variant by using the VT_VARIANT | VT_BYREF vartype, the variant being referred to cannot also be of type VT_VARIANT | VT_BYREF. VARIANTs can be passed by value, even if VARIANTARGs cannot. 下面又有:
    typedef struct FARSTRUCT tagVARIANT VARIANT;
    typedef struct FARSTRUCT tagVARIANT VARIANTARG;
    把我也弄糊涂了。不过我一般只用_variant_t,比较简单。另外,我在OAIDL.H看到了
    typedef VARIANT VARIANTARG;(其实和MSDN里的解释也差不多)
    所以,我猜测VARIANTARG只是一个别名,表达一个含义,实际上和VARIANT是一样的。