2.2.29.1 _wireVARIANT

The _wireVARIANT is a container for a union that in turn contains scalar and OLE Automation data types.

 typedef struct _wireVARIANT {
   DWORD clSize;
   DWORD rpcReserved;
   USHORT vt;
   USHORT wReserved1;
   USHORT wReserved2;
   USHORT wReserved3;
   [switch_type(ULONG), switch_is(vt)] 
     union {
     [case(VT_I8)] 
       LONGLONG llVal;
     [case(VT_I4)] 
       LONG lVal;
     [case(VT_UI1)] 
       BYTE bVal;
     [case(VT_I2)] 
       SHORT iVal;
     [case(VT_R4)] 
       FLOAT fltVal;
     [case(VT_R8)] 
       DOUBLE dblVal;
     [case(VT_BOOL)] 
       VARIANT_BOOL boolVal;
     [case(VT_ERROR)] 
       HRESULT scode;
     [case(VT_CY)] 
       CURRENCY cyVal;
     [case(VT_DATE)] 
       DATE date;
     [case(VT_BSTR)] 
       BSTR bstrVal;
     [case(VT_UNKNOWN)] 
       IUnknown* punkVal;
     [case(VT_DISPATCH)] 
       IDispatch* pdispVal;
     [case(VT_ARRAY)] 
       PSAFEARRAY parray;
     [case(VT_RECORD, VT_RECORD|VT_BYREF)] 
       BRECORD brecVal;
     [case(VT_UI1|VT_BYREF)] 
       BYTE* pbVal;
     [case(VT_I2|VT_BYREF)] 
       SHORT* piVal;
     [case(VT_I4|VT_BYREF)] 
       LONG* plVal;
     [case(VT_I8|VT_BYREF)] 
       LONGLONG* pllVal;
     [case(VT_R4|VT_BYREF)] 
       FLOAT* pfltVal;
     [case(VT_R8|VT_BYREF)] 
       DOUBLE* pdblVal;
     [case(VT_BOOL|VT_BYREF)] 
       VARIANT_BOOL* pboolVal;
     [case(VT_ERROR|VT_BYREF)] 
       HRESULT* pscode;
     [case(VT_CY|VT_BYREF)] 
       CURRENCY* pcyVal;
     [case(VT_DATE|VT_BYREF)] 
       DATE* pdate;
     [case(VT_BSTR|VT_BYREF)] 
       BSTR* pbstrVal;
     [case(VT_UNKNOWN|VT_BYREF)] 
       IUnknown** ppunkVal;
     [case(VT_DISPATCH|VT_BYREF)] 
       IDispatch** ppdispVal;
     [case(VT_ARRAY|VT_BYREF)] 
       PSAFEARRAY* pparray;
     [case(VT_VARIANT|VT_BYREF)] 
       VARIANT* pvarVal;
     [case(VT_I1)] 
       CHAR cVal;
     [case(VT_UI2)] 
       USHORT uiVal;
     [case(VT_UI4)] 
       ULONG ulVal;
     [case(VT_UI8)] 
       ULONGLONG ullVal;
     [case(VT_INT)] 
       INT intVal;
     [case(VT_UINT)] 
       UINT uintVal;
     [case(VT_DECIMAL)] 
       DECIMAL decVal;
     [case(VT_I1|VT_BYREF)] 
       CHAR* pcVal;
     [case(VT_UI2|VT_BYREF)] 
       USHORT* puiVal;
     [case(VT_UI4|VT_BYREF)] 
       ULONG* pulVal;
     [case(VT_UI8|VT_BYREF)] 
       ULONGLONG* pullVal;
     [case(VT_INT|VT_BYREF)] 
       INT* pintVal;
     [case(VT_UINT|VT_BYREF)] 
       UINT* puintVal;
     [case(VT_DECIMAL|VT_BYREF)] 
       DECIMAL* pdecVal;
     [case(VT_EMPTY)] 
             ;
     [case(VT_NULL)] 
             ;
   } _varUnion;
 } wireVARIANTStr;

clSize: MUST be set to the size, in quad words (64 bits), of the structure.

rpcReserved: MUST be set to 0 and MUST be ignored by the recipient.

vt: MUST be set to one of the values specified with a "V" in the Context column of the table in section 2.2.7.

wReserved1: MAY be set to 0 and MUST be ignored by the recipient.<6>

wReserved2: MAY be set to 0 and MUST be ignored by the recipient.<7>

wReserved3: MAY be set to 0 and MUST be ignored by the recipient.<8>

_varUnion: MUST contain an instance of the type, according to the value in the vt field.

Data of this type MUST be marshaled as specified in [C706] section 14, with the following additional restrictions.

  • All fields except _varUnion MUST be marshaled using a little-endian data representation, regardless of the data representation format label. For more information, see [C706] section 14.2.5.

  • If the vt field has the flag VT_ARRAY set, then _varUnion MUST be marshaled according to 2.2.30.

  • If the vt field has the flags VT_UNKNOWN or VT_DISPATCH set, then _varUnion MUST be marshaled according to [MS-DCOM] section 1.3.2.

  • If the vt field has the flag VT_RECORD set, then _varUnion field MUST be marshaled according to 2.2.28.

  • If the vt field has the flag VT_BSTR set, then _varUnion MUST be marshaled according to 2.2.23.

  • If none of the preceding flags is specified in the vt field, the _varUnion field MUST be marshaled by using a little-endian data representation, regardless of the data representation format label.