IAsyncReader :: SyncRead метод - PullRequest
       19

IAsyncReader :: SyncRead метод

0 голосов
/ 14 сентября 2018

Как я могу интерпретировать «запрос заполнения буфера», который возвращает S_FALSE («Я мог прочитать некоторые, но не все данные, которые вы запрашивали»), учитывая, что подпись:

HRESULT SyncRead(LONGLONG llPosition, LONG     lLength, BYTE     *pBuffer);

В частности, сколько байтов буфера допустимо, когда интерфейс возвращает S_FALSE?

Мне нужно это знать, верно?Возможно, я идиот, но я не вижу этого.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

См. Этот фрагмент кода из этого файла на собственном Git от Microsoft:

// sync read. works in stopped state as well as run state.
// need not be aligned. Will fail if read is beyond actual total
// length.
STDMETHODIMP SyncRead(
                  LONGLONG llPosition,  // absolute file position
                  LONG lLength,         // nr bytes required
                  BYTE* pBuffer);       // write data here

// return total length of stream, and currently available length.
// reads for beyond the available length but within the total length will
// normally succeed but may block for a long period.
STDMETHODIMP Length(
                  LONGLONG* pTotal,
                  LONGLONG* pAvailable);

В соответствии с этими двумя задокументированными декларациями, я думаю, довольно безопасно вывести количество байтов, прочитанное следующим образом. Скажем, вы хотите прочитать 70 байтов из позиции 800:

LONGLONG total, available;
pReader->Length(&total, &available);

LONG bytesRead = 70;
LONGLONG position = 800; 
if (S_FALSE == readerPtr->SyncRead(800, bytesRead, bufferPtr))
    bytesRead = total - position;

Если произойдет сбой, то число байтов, которые он мог прочитать, ограничено только общим размером.

0 голосов
/ 14 сентября 2018

IAsyncReader::SyncRead - это ярлык для синхронного чтения, не задумываясь о выравнивании данных. Хорошо оптимизированные фильтры обычно выполняют асинхронное чтение Request и WaitForNext, передавая данные с использованием выборок носителей с фактической длиной данных, прикрепленной к этим выборкам. В этом ярлыке они, казалось, упростили ситуацию, но просто потеряли этот выходной параметр.

Хорошая новость заключается в том, что вы можете получить исходный код фильтра (или его близкий родственник, поскольку базовый фильтр мог немного измениться с момента публикации исходного кода в качестве образца) и расширить фильтр на добавление например IAsyncReader2::SyncReadEx где вы возвращаете потерянное значение, когда вам это нужно.

...