barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 9 декабря 2011 г.

Копирование информации из SAFEARRAY

SAFEARRAY используется в C++  для передачи массивов в COM-вызовах (причем массивов, состоящих из любых элементов и любой размерности). Ниже показан пример как извлечь из такого "массива" (в данном случае - одномерного) элементы в массив типа byte:
SAFEARRAY *retSafeArray = NULL;
// здесь где-то вызывается COM-метод, возвращающий результат в retSafeArray
long resultByteArraySize = (retSafeArray->rgsabound)[0].cElements; // получаем число элементов, т.е. размер единственного измерения нашего одномерного массива
byte* resultByteArray = new byte[scanResultArraySize];
HRESULT safeArrayExtractionRes;
byte arrElem;
for(long i=0;i<resultByteArraySize;i++)
{
safeArrayExtractionRes = SafeArrayGetElement(retSafeArray, &i, &arrElem);
resultByteArray[i] = arrElem;
if(safeArrayExtractionRes != S_OK)
{
SafeArrayDestroy(retSafeArray);
retSafeArray = NULL; throw new exception("Error extracting data from SAFEARRAY %u\n",safeArrayExtractionRes);
}
}
SafeArrayDestroy(retSafeArray); // удалить больше ненужный SAFEARRAY
retSafeArray = NULL;


Комментариев нет:

Отправить комментарий