了解 tagVARIANT 结构
Understanding the tagVARIANT struct
COM VARIANT
类型是使用 tagVARIANT
结构定义的,如下所示:
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;
VARIANT_BOOL __OBSOLETE__VARIANT_BOOL;
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;
VARIANT_BOOL *__OBSOLETE__VARIANT_PBOOL;
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_NAME_...
标签是什么意思?
我正在尝试在 VBA 中手动构建其中一个,并且想了解所有成员的意思
What does __VARIANT_NAME_1 mean in a union struct?
typedef struct tagVARIANT {
union {
....
} __VARIANT_NAME_1;
} VARIANT;
它是那个未命名联合类型的变量名。在此上下文中,变量是 tagVARIANT
.
的成员
P.S。 __VARIANT_NAME_1
和该定义中的其他几个名称是为语言实现保留的名称。
如果定义了 NONAMELESSUNION,则 __VARIANT_NAME_1-2-3-4 分别求值为 n1、n2、n3、n4,否则它们将为空,成为无名联合。
#ifdef NONAMELESSUNION
#define __VARIANT_NAME_1 n1
#define __VARIANT_NAME_2 n2
#define __VARIANT_NAME_3 n3
#define __VARIANT_NAME_4 n4
#else
#define __tagVARIANT
#define __VARIANT_NAME_1
#define __VARIANT_NAME_2
#define __VARIANT_NAME_3
#define __VARIANT_NAME_4
#endif
VBA 没有“联合”,所以你需要做一个像这样的结构(vba 确实有结构,如果我没记错的话,已经有一段时间了)
Public Type MyVariant
vt As VarType ' or Integer
Value As String * (Longest size of a VBA (or Variant) type Possible, probably 16)
Dec As Decimal
End Type
然后使用 RtlMoveMemory() 处理数据与 Value
的相互复制,并使用 vt
字段确定 'Value' 中数据的大小和类型。我猜 Currency 或 Long64 将是除 Decimal 之外最大的类型。字符串和数组将是指针。
COM VARIANT
类型是使用 tagVARIANT
结构定义的,如下所示:
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;
VARIANT_BOOL __OBSOLETE__VARIANT_BOOL;
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;
VARIANT_BOOL *__OBSOLETE__VARIANT_PBOOL;
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_NAME_...
标签是什么意思?
我正在尝试在 VBA 中手动构建其中一个,并且想了解所有成员的意思
What does __VARIANT_NAME_1 mean in a union struct?
typedef struct tagVARIANT { union { .... } __VARIANT_NAME_1; } VARIANT;
它是那个未命名联合类型的变量名。在此上下文中,变量是 tagVARIANT
.
P.S。 __VARIANT_NAME_1
和该定义中的其他几个名称是为语言实现保留的名称。
如果定义了 NONAMELESSUNION,则 __VARIANT_NAME_1-2-3-4 分别求值为 n1、n2、n3、n4,否则它们将为空,成为无名联合。
#ifdef NONAMELESSUNION
#define __VARIANT_NAME_1 n1
#define __VARIANT_NAME_2 n2
#define __VARIANT_NAME_3 n3
#define __VARIANT_NAME_4 n4
#else
#define __tagVARIANT
#define __VARIANT_NAME_1
#define __VARIANT_NAME_2
#define __VARIANT_NAME_3
#define __VARIANT_NAME_4
#endif
VBA 没有“联合”,所以你需要做一个像这样的结构(vba 确实有结构,如果我没记错的话,已经有一段时间了)
Public Type MyVariant
vt As VarType ' or Integer
Value As String * (Longest size of a VBA (or Variant) type Possible, probably 16)
Dec As Decimal
End Type
然后使用 RtlMoveMemory() 处理数据与 Value
的相互复制,并使用 vt
字段确定 'Value' 中数据的大小和类型。我猜 Currency 或 Long64 将是除 Decimal 之外最大的类型。字符串和数组将是指针。