Страница 92 из 111 Структура SAFEARRAYBOUND Содержит информацию о границах одного измерения массива. Нижнюю границу задает ILbound, a cElements typedef struct tagSAFEARRAYBOUND { unsigned long cElements; long ILbound; } SAFEARRAYBOUND; . SafeArrayAccessData Увеличивает счетчик блокировок массива и возвращает указатель на данные массива. HRESULT SafeArrayAccessData ( SAFEARRAY FAR*psa, void HUGEP* FAR*ppvData );
Параметры: psa Указатель на дескриптор массива, созданный с помощью SafeArrayCreate. ppvData По возвращении указывает на указатель на данные массива. Размер массива может превышать 64К, так что в 16-разрядных Windows 3.1 и старше следует использовать указатели типа huge. Коды возврата: Из возвращенного HRESULT получают один из следующих кодов возврата: Код возврата | Значение | S_OK | Успех. | E_INVALIDARG | Параметр psa не является правильным дескриптором безопасного массива. | E_UNEXPECTED | Массив нельзя заблокировать. | Пример: В приведенном ниже примере выполняется сортировка одномерного безопасного массива BSTR с обращением к его элементам напрямую. Этот способ работает быстрее, чем если прибегнуть к SafeArrayGetElement и SafeArrayPutElement. long i, j, min; BSTR bstrTemp; BSTR HUGEP *pbstr; HRESULT hr; // Получить указатель на элементы массива. hr = SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr); if (FAILED(hr)) goto error;
// "Пузырьковая" сортировка.
cEleisents = lUBound-1l_Bound+1; for (i = 0; i < cElements-1) { min = i; for (j = i+1; j < cElements; j++) { if (wcscmp(pbstr[j], pbstr[min]) < 0) min = j; } // Поменять Maccив[min] и массив[1] bstrTemp = pbstr[min]; pbstr[min] = pbstr[i]; pbstr[i] = bstrTemp; }
SafeArrayUnaccessData(psa);
|