VARIANT 有什么特殊的作用?它是种什么样的类型?

解决方案 »

  1.   

    VIRIANT是ACTIVEX AUTOMATION需要用到的一种变量类型,可以称之为通用数据类型,其实它是一个结构。如果仅仅是调用ACTIVEX对象所提供的METHOD不需知道其中的细节。它仅用于通过IDISPATCH接口调用特定的METHOD或属性时用,VB和VC已经将这一过程透明。(主持人注:换句话说,VC会自动转换简单数据类型。) 
        关于下面的几个METHOD,例如OPENURL,在VB中原形是object.OpenUrl(url [,datatype] url是有效的URL字符串, DATATYPE是整形,返回指定URL的文档。在MFC中是CInternetSession::OpenURL 
        CStdioFile* OpenURL( LPCTSTR pstrURL, DWORD dwContext = 1, DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLength = 0 ); 
        Throw ( CInternetException ); 
        VARIANT的定义如下: 
        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. 
         }; 
        }; 
      

  2.   

    如何提供一个统一安全的机制来实现数据传递呢?在VC开发平台上,它提供了一个叫VARIANT的数据类型来解决这个问题。该数据类型有两部分组成,第一部分为数据的类型,第二部分才是具体的数据的数值。在VARIANT数据类型的基础上,VC提供了ColeVariant类,它对VARIANT数据类型进行了封装,这意味着在所有使用VARIANT的地方都可以使用ColeVariant类的对象