Возможно, вам стоит ознакомиться с документацией SafeArray на MSDN.
Что вы, вероятно, хотите сделать, это позвонить SafeArrayAccessData()
, чтобы получить указатель на буфер памяти безопасного массива, а затем перебрать значения напрямую. Вероятно, это самый эффективный способ доступа к значениям. Приведенный ниже код предполагает много, вы должны убедиться, что вы понимаете, эти предположения (читая безопасные документы массива), и что они держат в вашей конкретной ситуации ...
void Func(SAFEARRAY *pData)
{
void *pVoid = 0;
HRESULT hr = ::SafeArrayAccessData(pData, &pVoid);
MyErrorCheck::ThrowOnFailure(hr);
const long *pLongs = reinterpret_cast<long *>(pVoid);
for (int i = 0; i < pData->rgsabound[0].cElements; ++i)
{
const long val = pLongs[i];
DoThingWithLong(val);
}
hr = ::SafeArrayUnaccessData(pData);
MyErrorCheck::ThrowOnFailure(hr);
}
Обратите внимание, что выше код не имеет видел компилятор ...
Хорошо! Я собираюсь прочитать документацию по MSDN. Но мне действительно нужен второй элемент SAFEARRAY, не могу ли я просто назвать его с помощью индекса? Нужно ли мне повторять это? – user3030211
Нет, вам не нужно его повторять, вам нужно понять о части rgsabound [] безопасного массива. И, как сказал Игорь, вы, вероятно, будете нести ответственность за уничтожение массива, который был передан вам. Если вам ТОЛЬКО нужен доступ к второму элементу, используйте SafeArrayGetElement(). –
Я пытаюсь перебрать весь массив, чтобы лучше понять SAFEARRAYs, используя приведенный ниже код; не могли бы вы сказать мне, почему это не работает? 'код: long lBound; long uBound; SafeArrayGetUBound (информация, 1, & uBound); SafeArrayGetLBound (информация, 1, & lBound); \t float item; для (длинный Ind = LBOUND; Ind
user3030211