了解 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 之外最大的类型。字符串和数组将是指针。