Функция PeekNamedPipe
Чтение данных из канала функцией ReadFile вызывает удаление прочитанных данных. В противоположность этому, функция PeekNamedPipe позволяет получить данные из именованного или анонимного канала без удаления, так что при последующих вызовах этой функции или функции ReadFile будут получены все те же данные, что и при первом вызове функции PeekNamedPipe.
Еще одно отличие заключается в том, что функция PeekNamedPipe никогда не переходит в состояние ожидания, сразу возвращая управление вне зависимости от того, есть данные в канале или нет.
Прототип функции PeekNamedPipe представлен ниже:
BOOL PeekNamedPipe(
HANDLE hPipe, // идентификатор канала Pipe
LPVOID lpvBuffer, // адрес буфера для прочитанных данных
DWORD cbBuffer, // размер буфера прочитанных данных
LPDWORD lpcbRead, // адрес переменной, в которую будет
// записано количество действительно
// прочитанных байт данных
LPDWORD lpcbAvail, // адрес переменной, в которую будет
// записано общее количество байт данных,
// доступных в канале для чтения
LPDWORD lpcbMessage); // адрес переменной, в которую будет
// записано количество непрочитанных
// байт в данном сообщении
Через параметр hPipe функции PeekNamedPipe нужно передать идентификатор открытого анонимного или именованного канала Pipe.
Данные, полученные из канала, будут записаны в буфер lpvBuffer, имеющий размер cbBuffer байт. При этом количество действительно прочитанных байт будет сохранено в переменной, адрес которой передается функции PeekNamedPipe через параметр lpcbRead.
В случае успешного завершения функция PeekNamedPipe возвращает значение TRUE, а при ошибке - FALSE. Код ошибки можно получить, вызвав функцию GetLastError.