Справочник по технологии COM
Страница 108. SafeArrayPutElement


 

SafeArrayPutElement

Устанавливает значение элемента массива.

HRESULT SafeArrayPutElement
(
SAFEARRAY FAR* psa,
long FAR* rglndices,
void FAR*pv
);

Параметры:
psa
Указатель на дескриптор массива, созданный с помощью SafeArrayCreate.
rglndices
Массив индексов, по одному для каждого измерения массива. Самый правый (наименее значащий) индекс находится в rgIndices[0]. Самый левый индекс хранится в rgIndices[psa -< cDims-1 ].
pv
Указатель на данные, помещаемые в массив. Вариантные типы VT_DISPATCH, VT_UNKNOWN и VT_BSTR представляют собой указатели и не требуют дополнительного уровня косвенности.

Коды возврата:
Из возвращенного HRESULT получают один из следующих кодов возврата:

Код возврата Значение
S_OK Успех.
DISP_E_BADINDEX Задан неверный индекс.
E_INVALIDARG Один из аргументов неверен.
E_OUTOFMEMORY Невозможно выделить память для элемента.

Комментарии:
Перед присваиванием значения элементу и после этого функция автоматически вызывает SafeArrayLock и SafeArrayUnlock. Функция обеспечивает корректное присваивание данных, представляющих собой строку, объект или вариант. Если до присваивания элемент массива содержал строку, объект или вариант, то функция выполняет корректную очистку.
Примечание. Массив можно блокировать многократно. Можно помещать элементы в массив, заблокированный другими операциями.

Пример:

HRESULT PASCAL _export CPoly::EnumPoints(IEnumVARIANT FAR* FAR* ppenum)
{
unsigned int i;
HRESULT hresult;
VARIANT var;
SAFEARRAY FAR* psa;
CEnumPoint FAR* penum;
POINTLINK FAR* ppointlink;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_cPoints;

psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound); i
f(psa == NULL)
{
hresult = ResultFromScode(E_OUTOFMEMORY);
goto LError0;
}

// Код для краткости опущен.

V_VT(&var) = VT_DISPATCH;
hresult = ppointlink->ppoint->QueryInterface( IID_IDispatch, (void FAR* FAR*)&V_DISPATCH(&var));
if(hresult != NOERROR) goto LError1;

ix[0] = i;

SafeArrayPutElement(psa, ix, &var);
ppointlink = ppointlink->next;
};

hresult = CEnumPoint::Create(psa, &penum);
if(hresult != NOERROR) goto LError1;
*ppenum = penum;
return NOERROR;
LError1:
SafeArrayDestroy(psa);
LError0:
return hresult;
}

 
Следующая статья »