SafeArrayCreateEx 函数 (oleauto.h)

从指定的 VARTYPE、维度数和边界创建并返回安全数组描述符。

语法

SAFEARRAY * SafeArrayCreateEx(
  [in] VARTYPE        vt,
  [in] UINT           cDims,
  [in] SAFEARRAYBOUND *rgsabound,
  [in] PVOID          pvExtra
);

参数

[in] vt

数组中每个元素的基类型或 VARTYPE。 可以为变体类型设置FADF_RECORD标志VT_RECORD,可以为VT_DISPATCH或VT_UNKNOWN设置FADF_HAVEIID标志,也可以为所有其他 VARTYPE 设置FADF_HAVEVARTYPE。

[in] cDims

数组的维数。

[in] rgsabound

边界向量 (要为数组分配的每个维度) 一个。

[in] pvExtra

用户定义类型的类型信息(如果要创建用户定义的类型的安全数组)。 如果 vt 参数VT_RECORD,则 pvExtra 将是指向描述记录的 IRecordInfo 的指针。 如果 vt 参数VT_DISPATCH或VT_UNKNOWN,则 pvExtra 将包含指向 GUID 的指针,该 GUID 表示要传递给数组的接口类型。

返回值

安全数组描述符;如果无法创建数组,则为 null。

注解

如果 VARTYPE VT_RECORD则调用 SafeArraySetRecordInfo 。 如果 VARTYPE VT_DISPATCH或VT_UNKNOWN则数组的元素必须包含相同类型的接口。 将此数组封送给其他进程的一部分过程包括生成 pvExtra 参数指向的 IID 的代理/存根代码。 若要实际传递异类接口,需要在 pvExtra 中指定IID_IUnknown或IID_IDispatch,并为调用方提供一些其他方法来标识如何查询实际接口。

示例

以下示例说明如何将用户定义类型的安全数组存储到 VT_RECORD 类型的变体中。

SAFEARRAYBOUND * sab;
sab.cElements = 2;
sab.lLbound = 0;
hresult hr;

SAFEARRAY Sa;
Sa = SafeArrayCreateEx(VT_RECORD, 1, &sab, pRecInfo);
if (Sa == NULL)
   return E_OUTOFMEMORY;

PVOID pvData;
hr = SafeArrayAccessData(Sa, &pvData);
if (FAILED(hr)) {
   SafeArrayDestroy(Sa);
   return hr;
}

TEST * pTest;
pTest = (TEST *)pvData;
pTest[0] = a;
pTest[1] = b;
hr = SafeArrayUnaccessData(Sa);
if (FAILED(hr)) {
   SafeArrayDestroy(Sa);
   return hr;
}

VariantInit(&variant);
V_VT(&variant) = VT_ARRAY|VT_RECORD;
V_ARRAY(&variant) = Sa;

要求

要求
目标平台 Windows
标头 oleauto.h
Library OleAut32.lib
DLL OleAut32.dll