Функция 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 |