How would I define vtLoc and vtEmpty in asm?
CComVariant vtLoc(CSIDL_DESKTOP);
CComVariant vtEmpty;
http://masm32.com/board/index.php?topic=4019.0
vtEmpty.vt = 0
vtLoc.vt = 3 ; VT_I4
vtLoc.I4 = 0 ; CSIDL_DESKTOP
So ?vtLoc VARIANT <3>
vtEmpty VARIANT <0>
EDIT:VARIANT 16 10h bytes
vt +0h 2h
iVal +8h 2h
pvRecord +8h 4h
pRecInfo +Ch 4h
x64
VARIANT 24 18h bytes
vt +0h 2h
iVal +8h 2h
pvRecord +8h 8h
pRecInfo +10h 8h
vtEmpty dq 0,0
vtLoc dq 3,0
or
vtEmpty dq VT_EMPTY,0
vtLoc dq VT_I4 ,CSIDL_DESKTOP
X64
vtEmpty dq VT_EMPTY,0,0
vtLoc dq VT_I4 ,CSIDL_DESKTOP,0
So in effect
vtEmpty <type=0 (empty),
0,0,0 (reserved),
0,0 (no data)>
vtLoc <type=3 (I4),
0,0,0 (reserved),
0 (data=CSIDL_DESKTOP),
0 (no data)>
Right?
PVOID typedef PTR VOID
MAXSIZEISPTR typedef PTR
tagVariant STRUCT
vt dw ?
reserved word 3 dup (?)
union
struct __tagBRECORD
pvRecord PVOID ?
pRecInfo PVOID ?
ends
various MAXSIZEISPTR ?
ends
tagVariant ends
.data
vtEmpty tagVariant <0,{0,0,0},{{0,0}}>
vtLoc tagVariant <3,{0,0,0},{{0,0}}>
Now that is a lot easier to understand than this
typedef struct tagVARIANT {
union {
struct {
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union {
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct {
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} VARIANT;
VARIANT STRUCT
vt WORD 0
wReserved1 WORD 0 ; For VT_DECIMAL
wReserved2 WORD 0 ; For VT_DECIMAL
wReserved3 WORD 0 ; For VT_DECIMAL
Union
lVal SDWORD ? ; VT_I4
bVal byte ? ; VT_UI1
iVal SWORD ? ; VT_I2
fltVal REAL4 ? ; VT_R4
llVal QWORD ? ; VT_I8
dblVal REAL8 ? ; VT_R8
boolVal WORD ? ; VT_BOOL
scode DWORD ? ; VT_ERROR
cyVal QWORD ? ; VT_CY
date QWORD ? ; VT_DATE
bstrVal DWORD ? ; VT_BSTR
punkVal DWORD ? ; VT_UNKNOWN
pdispVal DWORD ? ; VT_DISPATCH
parray DWORD ? ; VT_ARRAY
pbVal DWORD ? ; VT_BYREF|VT_UI1
piVal DWORD ? ; VT_BYREF|VT_I2
plVal DWORD ? ; VT_BYREF|VT_I4
pfltVal DWORD ? ; VT_BYREF|VT_R4
pdblVal DWORD ? ; VT_BYREF|VT_R8
pboolVal DWORD ? ; VT_BYREF|VT_BOOL
pscode DWORD ? ; VT_BYREF|VT_ERROR
pcyVal DWORD ? ; VT_BYREF|VT_CY
pdate DWORD ? ; VT_BYREF|VT_DATE
pbstrVal DWORD ? ; VT_BYREF|VT_BSTR
ppunkVal DWORD ? ; VT_BYREF|VT_UNKNOWN
ppdispVal DWORD ? ; VT_BYREF|VT_DISPATCH
pparray DWORD ? ; VT_BYREF|VT_ARRAY
pvarVal DWORD ? ; VT_BYREF|VT_VARIANT
byref DWORD ? ; Generic ByRef
cVal SBYTE ? ; VT_I1
uiVal WORD ? ; VT_UI2
ulVal DWORD ? ; VT_UI4
intVal SWORD ? ; VT_int
uintVal WORD ? ; VT_uint
pdecVal DWORD ? ; VT_BYREF|VT_DECIMAL
pcVal DWORD ? ; VT_BYREF|VT_I1
puiVal DWORD ? ; VT_BYREF|VT_UI2
pulVal DWORD ? ; VT_BYREF|VT_UI4
pintVal DWORD ? ; VT_BYREF|VT_int
puintVal DWORD ? ; VT_BYREF|VT_uint
STRUCT ; for VT_RECORD
pvRecord DWORD ?
pRecInfo DWORD ?
ENDS
ENDS
VARIANT ENDS
For VT_DECIMAL:
VARIANT STRUCT
wReserved SWORD 14 ; =14 (VT_DECIMAL)
UNION
signscale SWORD ?
STRUCT
scale BYTE ? ; Power of 10
sign BYTE ? ; FALSE/TRUE (0,-1)
ENDS
ends
Hi32 SDWORD ?
UNION
Lo64 QWORD ?
STRUCT
Lo32 SDWORD ?
Mid32 SDWORD ?
ENDS
ends
VARIANT ENDS
Structures with nested structures and unions can be a bit tricky to initialize.
Here it will be legit to simple initialize as follows, although a bit confusing:
vtEmpty tagVariant <0>
vtLoc tagVariant <3>