SAFEARRAY 结构 (oaidl.h)

表示安全数组。

语法

typedef struct tagSAFEARRAY {
  USHORT         cDims;
  USHORT         fFeatures;
  ULONG          cbElements;
  ULONG          cLocks;
  PVOID          pvData;
  SAFEARRAYBOUND rgsabound[1];
} SAFEARRAY;

成员

cDims

维度数。

fFeatures

标志。

含义
FADF_AUTO
0x0001
在堆栈上分配的数组。
FADF_STATIC
0x0002
静态分配的数组。
FADF_EMBEDDED
0x0004
嵌入结构中的数组。
FADF_FIXEDSIZE
0x0010
不能调整大小或重新分配的数组。
FADF_RECORD
0x0020
包含记录的数组。 设置后,数组描述符中将有一个指针指向 IRecordInfo 接口的负偏移量 4。
FADF_HAVEIID
0x0040
具有 IID 标识接口的数组。 设置后,安全数组描述符中将有一个负偏移量为 16 的 GUID。 仅当同时设置FADF_DISPATCH或FADF_UNKNOWN时,才会设置标志。
FADF_HAVEVARTYPE
0x0080
具有变体类型的数组。 可以使用 SafeArrayGetVartype 检索变体类型。
FADF_BSTR
0x0100
BSTR 数组。
FADF_UNKNOWN
0x0200
IUnknown*的数组。
FADF_DISPATCH
0x0400
IDispatch*的数组。
FADF_VARIANT
0x0800
VARIANT 数组。
FADF_RESERVED
0xF008
保留供将来使用的位。

cbElements

数组元素的大小。

cLocks

数组在未进行相应解锁的情况下被锁定的次数。

pvData

数据。

rgsabound[1]

每个维度的一个绑定。

注解

数组 rgsabound 以最左侧的维度存储在 rgsabound[0] 中,最右侧的维度存储在 中 rgsabound[cDims - 1]。 如果在类似 C 的语法中将数组指定为 [2][5],则 rgsabound 向量中有两个元素。 元素 0 的 lLbound0,cElements 为 2。 元素 1 的 lLbound0,cElements 为 5。

fFeatures 标志描述可能影响数组释放方式的数组的属性。 fFeatures 字段描述 SAFEARRAY 中存储的数据类型以及数组的分配方式。 这允许释放数组而不引用其包含的变体。

线程安全性

SAFEARRAY 数据类型的所有公共静态成员都是线程安全的。 不保证实例成员是线程安全的。

例如,假设某个应用程序使用 SafeArrayLockSafeArrayUnlock 函数。 如果从同一 SAFEARRAY 数据类型实例上的不同线程并发调用这些函数,可能会创建不一致的锁计数。 这最终会导致 SafeArrayUnlock 函数返回E_UNEXPECTED。 可以通过提供自己的同步代码来防止这种情况。

要求

要求
Header oaidl.h