| 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 int |
| long | int | (p)lVal | 3 | VT_I4 | [V][T][P][S] 4 byte signed int |
| 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 |
| 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] IDispatch * |
| SCODE | int | (p)scode | 10 | VT_ERROR | [V][T][P][S] SCODE |
| VARIANT_BOOL | word | (p)boolVal | 11 | VT_BOOL | [V][T][P][S] True=-1, False=0 |
| VARIANT* | VARIANT* | pvarVal | 12 | VT_VARIANT | [V][T][P][S] VARIANT * |
| IUnknown* | IUnknown | (p)punkVal | 13 | VT_UNKNOWN | [V][T] [S] IUnknown * |
| DECIMAL | DECIMAL | (p)decVal | 14 | VT_DECIMAL | [V][T] [S] 14 bytes |
| char | byte | (p)cVal | 16 | VT_I1 | [V][T][P][S] signed char |
| BYTE | byte | (p)bVal | 17 | VT_UI1 | [V][T][P][S] unsigned char |
| unsigned short | word | (p)uiVal | 18 | VT_UI2 | [V][T][P][S] unsigned short |
| unsigned long | int | (p)ulVal | 19 | VT_UI4 | [V][T][P][S] unsigned long |
| 20 | VT_I8 | [T][P] signed 64-bit int | |||
| 21 | VT_UI8 | [T][P] unsigned 64-bit int | |||
| int | int | (p)intVal | 22 | VT_INT | [V][T][P][S] signed machine int |
| unsigned int | int | (p)uintVal | 23 | VT_UINT | [V][T] [S] unsigned machine int |
| void* | byte* | byref | 24 | VT_VOID | [T] C style void |
| 25 | VT_HRESULT | [T] Standard return type | |||
| 26 | VT_PTR | [T] pointer type | |||
| (p)parray | 27 | VT_SAFEARRAY | [T] (use VT_ARRAY in VARIANT) | ||
| 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 | ||
| 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] A Class ID | |||
| 0x1000 | VT_VECTOR | [P] simple counted array | |||
| 0x2000 | VT_ARRAY | [V] SAFEARRAY* | |||
| 0x4000 | VT_BYREF | [V] void* for local use |
[V] - can appear in VARIANT.
(p) - exsists also member with p prefix. It is pointer, therefore vt must include VT_BYREF.
For VARIANT* (pvarVal), vt must include VT_BYREF.
For safe arrays, vt combines element type and VT_ARRAY.