Сущность технологии COM



         

Управление потоками данных - часть 3


преобразуется следующим образом:

HRESULT Sum([in] IEnumDouble *ped, [out, retval] double *pResult);

Отметим, что подсчет элементов больше не является обязательным, так как получатель данных обнаружит конец массива, когда метод IEnumDouble::Next возвратит специальный HRESULT (S_FALSE).

При наличии приведенного выше определения интерфейса корректной была бы следующая реализация метода:

STDMETHODIMP MyClass::Sum(IEnumDouble *ped, double *psum) { assert(ped && psum); *psum = 0; HRESULT hr; do { // declare a buffer to receive some elements // объявляем буфер для получения нескольких элементов enum { CHUNKSIZE = 2048 }; double rgd[CHUNKSIZE]; // ask data producer to send CHUNKSIZE elements // просим источник данных послать CHUNKSIZE элементов ULONG cFetched; hr = ped->Next(CHUNKSIZE, rgd, &cFetched); // adjust cFetched to address sloppy objects // настраиваем cFetched на исправление некорректных объектов if (hr == S_OK) cFetched = CHUNKSIZE; if (SUCCEEDED(hr)) // S_OK or S_FALSE // S_OK или S_FALSE // consume/use received elements // потребляем/используем полученные элементы for (ULONG n = О; п < cFetched; n++) *psum += rgd[n]; } while (hr == S_OK); // S_FALSE or error terminates // завершается по S_FALSE или по ошибке }

Отметим, что подпрограмма Next возвратит S_OK в случае, если у отправителя имеются дополнительные данные для посылки, и S_FALSE, если пересылка закончена. Также отметим, что в данный код включена защита от некорректных реализации, которые не утруждают себя установкой переменной cFetched при возвращении S_OK (S_OK означает, что все запрошенные элементы были извлечены).

Одно из преимуществ использования идиомы IEnum состоит в том, что она позволяет отправителю откладывать генерирование элементов массива. Рассмотрим следующее определение метода на IDL:

HRESULT GetPrimes([in] long nMin, [in] long nMax, [out] IEnumLong **ppe);

Разработчик объекта может создать специальный класс, который генерирует по требованию простые числа и реализует интерфейс IEnumLong:




Содержание  Назад  Вперед