VARIANT members table

C type QM type Name vt vt constant Comments
      0 VT_EMPTY [V] [P] nothing
      1 VT_NULL [V] [P] SQL style Null
short word (p)iVal 2 VT_I2 [V][T][P][S] 2 byte signed integer
int, long int (p)lVal 3 VT_I4 [V][T][P][S] 4 byte signed integer
float FLOAT (p)fltVal 4 VT_R4 [V][T][P][S] 4 byte real
double double (p)dblVal 5 VT_R8 [V][T][P][S] 8 byte real
CY CURRENCY (p)cyVal 6 VT_CY [V][T][P][S] currency
DATE DATE (p)date 7 VT_DATE [V][T][P][S] date/time
BSTR BSTR (p)bstrVal 8 VT_BSTR [V][T][P][S] OLE Automation string
IDispatch* IDispatch (p)pdispVal 9 VT_DISPATCH [V][T][P][S] interface that supports IDispatch
SCODE int (p)scode 10 VT_ERROR [V][T][P][S] error code
VARIANT_BOOL word (p)boolVal 11 VT_BOOL [V][T][P][S] boolean. True=-1 (0xffff in word), False=0.
VARIANT* VARIANT* pvarVal 12 VT_VARIANT [V][T][P][S] In VARIANT it is pointer to other VARIANT, with VT_BYREF flag. In array not pointer.
IUnknown* IUnknown (p)punkVal 13 VT_UNKNOWN [V][T] [S] interface that does not support IDispatch
DECIMAL DECIMAL (p)decVal 14 VT_DECIMAL [V][T] [S] uses whole VARIANT
char byte (p)cVal 16 VT_I1 [V][T][P][S] 1 byte signed integer
BYTE (unsigned char) byte (p)bVal 17 VT_UI1 [V][T][P][S] 1 byte unsigned integer
WORD (unsigned short) word (p)uiVal 18 VT_UI2 [V][T][P][S] 2 byte unsigned integer
DWORD (unsigned long) int (p)ulVal 19 VT_UI4 [V][T][P][S] 4 byte unsigned integer
__int64 long (p)llVal 20 VT_I8 [V][T][P][S] 8 byte signed integer
unsigned __int64 long (p)ullVal 21 VT_UI8 [V][T][P][S] 8 byte unsigned integer
int int (p)intVal 22 VT_INT [V][T][P][S] use VT_I4 instead
UINT (unsigned int) int (p)uintVal 23 VT_UINT [V][T] [S] use VT_UI4 instead
void* byte* byref 24 VT_VOID [T] C style void
           
      25 VT_HRESULT [T] Standard return type
      26 VT_PTR [T] pointer type
      27 VT_SAFEARRAY [T] safe array
      28 VT_CARRAY [T] C style array
      29 VT_USERDEFINED [T] user-defined type
      30 VT_LPSTR [T][P] null terminated string
      31 VT_LPWSTR [T][P] wide null terminated string
    pvRecord 36 VT_RECORD [V] [P][S] user-defined type. In QM used only in arrays.
      64 VT_FILETIME [P] FILETIME
      65 VT_BLOB [P] Length prefixed bytes
      66 VT_STREAM [P] Name of the stream follows
      67 VT_STORAGE [P] Name of the storage follows
      68 VT_STREAMED_OBJECT [P] Stream contains an object
      69 VT_STORED_OBJECT [P] Storage contains an object
      70 VT_BLOB_OBJECT [P] Blob contains an object
      71 VT_CF [P] Clipboard format
      72 VT_CLSID [P] Class ID
           
      0x1000 VT_VECTOR [P] simple counted array (flag)
    (p)parray 0x2000 VT_ARRAY [V] SAFEARRAY* (flag)
      0x4000 VT_BYREF [V] pointer (flag)

 

If SAFEARRAY* (ARRAY in QM) is stored in VARIANT, vt is element type with VT_ARRAY flag.

(p) - exists member with p prefix. It is pointer, and vt is with VT_BYREF flag.

[V] - may appear in a VARIANT.

[S] - may appear in a SAFEARRAY.

[P] - may appear in an OLE property set.

[T] - may appear in a TYPEDESC (type library).