Страница 108 из 111 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; }
|