Поделиться через


Функция 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 вариантного типа, флаг FADF_HAVEIID можно задать для VT_DISPATCH или VT_UNKNOWN, а FADF_HAVEVARTYPE — для всех остальных varTYPEs.

[in] cDims

Число измерений в массиве.

[in] rgsabound

Вектор границ (по одному для каждого измерения), выделяемый для массива.

[in] pvExtra

сведения о типе определяемого пользователем типа, если создается безопасный массив определяемых пользователем типов. Если параметр vt имеет VT_RECORD, то pvExtra будет указателем на IRecordInfo , описывающий запись. Если параметр vt VT_DISPATCH или VT_UNKNOWN, pvExtra будет содержать указатель на GUID, представляющий тип интерфейса, передаваемого в массив.

Возвращаемое значение

Безопасный дескриптор массива или значение NULL, если массив не удалось создать.

Комментарии

Если параметр VARTYPE имеет VT_RECORD вызывается SafeArraySetRecordInfo . Если VARTYPE VT_DISPATCH или VT_UNKNOWN то элементы массива должны содержать интерфейсы одного типа. Часть процесса маршалинга этого массива в другие процессы включает создание кода прокси-сервера или заглушки IID, на который указывает параметр pvExtra . Чтобы фактически передать разнородные интерфейсы, необходимо указать либо IID_IUnknown, либо IID_IDispatch в pvExtra , а также предоставить другие средства для того, чтобы вызывающий объект определил, как запрашивать фактический интерфейс.

Примеры

В следующем примере описывается, как безопасный массив определяемых пользователем типов сохраняется в варианте типа 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
Header oleauto.h
Библиотека OleAut32.lib
DLL OleAut32.dll