2013-11-26 3 views
2

Я пытаюсь получить элементы из SAFEARRAY (возвращенные как выходные данные функции) в Visual C++.Получить элемент из SAFEARRAY (или преобразовать его в длинный массив)

Я никогда раньше не использовал SAFEARRAY, поэтому я не знаю, как с этим бороться. Должен ли я преобразовать SAFEARRAY в длинный массив (как?) Или я могу просто использовать индекс значений внутри SAFEARRAY?

ответ

3

Возможно, вам стоит ознакомиться с документацией 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); 
} 

Обратите внимание, что выше код не имеет видел компилятор ...

+0

Хорошо! Я собираюсь прочитать документацию по MSDN. Но мне действительно нужен второй элемент SAFEARRAY, не могу ли я просто назвать его с помощью индекса? Нужно ли мне повторять это? – user3030211

+0

Нет, вам не нужно его повторять, вам нужно понять о части rgsabound [] безопасного массива. И, как сказал Игорь, вы, вероятно, будете нести ответственность за уничтожение массива, который был передан вам. Если вам ТОЛЬКО нужен доступ к второму элементу, используйте SafeArrayGetElement(). –

+0

Я пытаюсь перебрать весь массив, чтобы лучше понять SAFEARRAYs, используя приведенный ниже код; не могли бы вы сказать мне, почему это не работает? 'код: long lBound; long uBound; SafeArrayGetUBound (информация, 1, & uBound); SafeArrayGetLBound (информация, 1, & lBound); \t float item; для (длинный Ind = LBOUND; Ind user3030211

2

См. SafeArrayGetElement или SafeArrayAccessData. Первый извлекает элементы один за другим. Последний дает вам указатель на плоский массив C-стиля, который обертывает этот экземпляр SAFEARRAY (не забудьте сделать SafeArrayUnaccesData, когда вы закончите).

Обратите внимание, что, скорее всего, вы несете ответственность за уничтожение массива (с помощью SafeArrayDestroy), как только вы больше не нуждаетесь в нем.

+0

спасибо. Я только что видел эти функции, но я не могу понять проблему; вы могли бы заставить меня (или связать мне) пример обеих функций? – user3030211