Как перебрать SAFEARRAY **

Как перебрать указатель Safearray в C ++ на указатель и получить доступ к его элементам.

Я попытался повторить решение, опубликованное Лим Био Лионг
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/022dba14-9abf-4872-9f43-f4fc05bd2602
но самое странное, что сигнатура метода IDL оказывается

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY ** test_struct_array);

вместо

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY(TestStruct)* test_struct_array);

Есть идеи?

заранее спасибо

10

Решение

Safearrays создаются с SafeArrayCreate или же SafeArrayCreateVector, но когда вы спросите об итерации SAFEARRAY, предположим, у вас уже есть SAFEARRAY, возвращенный какой-то другой функцией. Одним из способов является использование SafeArrayGetElement API, который особенно удобен, если у вас есть многомерные SAFEARRAY, так как он позволяет, IMO, немного легче указывать индексы.

Однако для векторов (одномерный SAFEARRAY) более быстрый доступ к данным напрямую и итерация по значениям. Вот пример:

Допустим, это БЕЗОПАСНЫЙ longс, т.е. VT_I4

// get them from somewhere. (I will assume that this is done
// in a way that you are now responsible to free the memory)
SAFEARRAY* saValues = ...
LONG* pVals;
HRESULT hr = SafeArrayAccessData(saValues, (void**)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
long lowerBound, upperBound;  // get array bounds
SafeArrayGetLBound(saValues, 1 , &lowerBound);
SafeArrayGetUBound(saValues, 1, &upperBound);

long cnt_elements = upperBound - lowerBound + 1;
for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
{
LONG lVal = pVals[i];
std::cout << "element " << i << ": value = " << lVal << std::endl;
}
SafeArrayUnaccessData(saValues);
}
SafeArrayDestroy(saValues);
21

Другие решения

MSDN Функция SafeArrayGetElement дает фрагмент кода по использованию SafeArrayGetElement получить отдельный объект для массива.

SAFEARRAY состав а также SafeArray* Функции объясняют доступный API.

В проекте ATL / MFC вы хотели бы использовать классы-оболочки, например, CComSafeArray сделать вещи проще и проще. Увидеть Упрощение программирования SAFEARRAY с помощью CComSafeArray на этом.

3

По вопросам рекламы [email protected]