Составители:
Если канал находится в режиме чтения сообщений, функция PeekNamedPipe() все-
гда останавливается, прочитав первое сообщение, - даже если в буфере осталось место 
для нескольких сообщений. Кроме того, функция PeekNamedPipe() никогда не блокиру-
ет  пустой  канал,  как  это  делает  функция ReadFile() при  установленном  флаге 
PIPE_WAIT.  Режим  ожидания  не  влияет  на  функцию PeekNamedPipe(), которая  всегда 
возвращает результат немедленно. 
Все операции, которые выполнялись при создании канала - именованного или ано-
нимного, блокируемого или неблокируемого, байтового канала или канала сообщений, - 
являлись подготовительными, обеспечивающими возможность передачи данных по это-
му каналу. Для операций непосредственно чтения - записи используются функции Wri-
teFile()  и ReadFile(). Данные  функции,  как  и CreateFile() рассмотрены  нами  ранее  при 
изучении файлового ввода-вывода. Однако рассмотрим их еще раз с учетом специфики 
каналов. 
BOOL WriteFile( 
HANDLE hFile,   // куда записывать (канал или файл)  
CONST VOID *lpBuffer,    //указывает данные, которые должны быть 
// записаны в файл  
DWORD dwBytesToWrite,    // количество записываемых байтов 
LPDWORD lpdwBytesWritten,  // возвращает количество записанных байтов 
LPOVERLAPPED lpOverlapped );  // задает поддержку асинхронного 
// ввода/вывода 
BOOL ReadFile( 
HANDLE hFile;    // источник для чтения данных (канал или файл)  
LPVOID lpBuffer;   // буфер для временного хранения 
// прочитанных данных  
DWORD dwBytesToRead;    // количество байтов, которые должны быть 
// прочитаны  
LPDWORD lpdwBytesRead;  // возвращает количество прочитанных байтов  
LPOVERLAPPED lpOverlapped );  // поддержка асинхронного ввода/вывода 
Количество  байтов,  которые  должны  быть  прочитаны  или  записаны,  не  обяза-
тельно должно совпадать с размером буфера, однако превышать этот размер оно не мо-
жет. Если при вызове функции ReadFile() для канала, который работает в режиме сооб-
щений,  вы  зададите  параметру dwBytesToRead значение,  меньшее,  чем  размер 
следующего  сообщения,  функция ReadFile() прочитает  только  часть  сообщения  и  воз-
вратит  значение FALSE.
  Если  после  этого  проанализировать  причину  ошибки,  вызвав 
функцию GetLastError(), она возвратит код  ошибки ERROR_MORE_DATA.
  Чтобы про-
читать остаток  сообщения,  следует  снова  вызвать функцию ReadFile() или PeekNamed-
Pipe().  Если  функция WriteFile() записывает  данные  в  неблокируемый  канал,  который 
работает в байтовом режиме, и видит, что его буфер почти заполнен, она все равно воз-
вращает значение TRUE, однако значение lpdwBytesWritten окажется меньшим, чем зна-
чение dwBytesToWrite. 
В зависимости от режима ожидания канала функции WriteFile() и ReadFile() могут 
блокироваться. Функция WriteFile() может ожидать, пока  заполненный  канал  не  осво-
бодится на другом конце. Функция ReadFile() может быть заблокирована пустым кана-
лом вплоть до момента поступления нового сообщения. 
Последний  параметр  обеих  функции  представляет  собой  указатель  на  структуру 
OVERLAPPED,
 которая содержит дополнительную информацию, предназначенную для 
поддержки  асинхронного  или  перекрывающегося  ввода/вывода,  который  рассмотрен 
нами ранее.  
185
      Если канал находится в режиме чтения сообщений, функция PeekNamedPipe() все-
гда останавливается, прочитав первое сообщение, - даже если в буфере осталось место
для нескольких сообщений. Кроме того, функция PeekNamedPipe() никогда не блокиру-
ет пустой канал, как это делает функция ReadFile() при установленном флаге
PIPE_WAIT. Режим ожидания не влияет на функцию PeekNamedPipe(), которая всегда
возвращает результат немедленно.
      Все операции, которые выполнялись при создании канала - именованного или ано-
нимного, блокируемого или неблокируемого, байтового канала или канала сообщений, -
являлись подготовительными, обеспечивающими возможность передачи данных по это-
му каналу. Для операций непосредственно чтения - записи используются функции Wri-
teFile() и ReadFile(). Данные функции, как и CreateFile() рассмотрены нами ранее при
изучении файлового ввода-вывода. Однако рассмотрим их еще раз с учетом специфики
каналов.
BOOL WriteFile(
     HANDLE hFile,                // куда записывать (канал или файл)
     CONST VOID *lpBuffer,        //указывает данные, которые должны быть
                                  // записаны в файл
     DWORD dwBytesToWrite,        // количество записываемых байтов
     LPDWORD lpdwBytesWritten,    // возвращает количество записанных байтов
     LPOVERLAPPED lpOverlapped ); // задает поддержку асинхронного
                                  // ввода/вывода
BOOL ReadFile(
     HANDLE hFile;         // источник для чтения данных (канал или файл)
     LPVOID lpBuffer;             // буфер для временного хранения
                                  // прочитанных данных
     DWORD dwBytesToRead;         // количество байтов, которые должны быть
                                  // прочитаны
     LPDWORD lpdwBytesRead;       // возвращает количество прочитанных байтов
     LPOVERLAPPED lpOverlapped ); // поддержка асинхронного ввода/вывода
      Количество байтов, которые должны быть прочитаны или записаны, не обяза-
тельно должно совпадать с размером буфера, однако превышать этот размер оно не мо-
жет. Если при вызове функции ReadFile() для канала, который работает в режиме сооб-
щений, вы зададите параметру dwBytesToRead значение, меньшее, чем размер
следующего сообщения, функция ReadFile() прочитает только часть сообщения и воз-
вратит значение FALSE. Если после этого проанализировать причину ошибки, вызвав
функцию GetLastError(), она возвратит код ошибки ERROR_MORE_DATA. Чтобы про-
читать остаток сообщения, следует снова вызвать функцию ReadFile() или PeekNamed-
Pipe(). Если функция WriteFile() записывает данные в неблокируемый канал, который
работает в байтовом режиме, и видит, что его буфер почти заполнен, она все равно воз-
вращает значение TRUE, однако значение lpdwBytesWritten окажется меньшим, чем зна-
чение dwBytesToWrite.
      В зависимости от режима ожидания канала функции WriteFile() и ReadFile() могут
блокироваться. Функция WriteFile() может ожидать, пока заполненный канал не осво-
бодится на другом конце. Функция ReadFile() может быть заблокирована пустым кана-
лом вплоть до момента поступления нового сообщения.
      Последний параметр обеих функции представляет собой указатель на структуру
OVERLAPPED, которая содержит дополнительную информацию, предназначенную для
поддержки асинхронного или перекрывающегося ввода/вывода, который рассмотрен
нами ранее.
                                        185
Страницы
- « первая
- ‹ предыдущая
- …
- 181
- 182
- 183
- 184
- 185
- …
- следующая ›
- последняя »
