Программирование для Windows NT (том 2)

       

Определение состояния канала Mailslot


Серверный процесс может определить текущее состояние канала Mailslot по его идентификатору с помощью функции GetMailslotInfo. Прототип этой функции мы привели ниже:

BOOL GetMailslotInfo(

  HANDLE  hMailslot,        // идентификатор канала Mailslot

  LPDWORD lpMaxMessageSize, // адрес максимального размера

                            // сообщения

  LPDWORD lpNextSize,    // адрес размера следующего сообщения

  LPDWORD lpMessageCount,   // адрес количества сообщений

  LPDWORD lpReadTimeout);   // адрес времени ожидания

Через параметр hMailslot функции передается идентификатор канала Mailslot, состояние которого необходимо определить.

Остальные параметры задаются как указатели на переменные типа DWORD, в которые будут записаны параметры состояния канала Mailslot.

В переменную, адрес которой передается через параметр lpMaxMessageSize, после возвращения из функции GetMailslotInfo будет записан максимальный размер сообщения. Вы можете использовать это значение для динамического получения буфера памяти, в который это сообщение будет прочитано функцией ReadFile.

В переменную, адрес которой указан через параметр lpNextSize, записывается размер следующего сообщения, если оно есть в канале. Если же в канале больше нет сообщений, в эту переменную будет записана константа MAILSLOT_NO_MESSAGE.

   С помощью параметра lpMessageCount вы можете определить количество сообщений, записанных в канал клиентскими процессами. Если это количество равно нулю, вам не следует вызывать функцию ReadFile для чтения несуществующего сообщения.

И, наконец, в переменную, адрес которой задается в параметре lpReadTimeout, записывается текущее время ожидания, установленное для канала (в миллисекундах).

Если вам не нужна вся информация, которую можно получить с помощью функции GetMailslotInfo, некоторые из ее параметров (кроме, разумеется, первого) можно указать как NULL.

В случае успешного завершения функция GetMailslotInfo возвращает значение TRUE, а при ошибке - FALSE. Код ошибки можно получить, вызвав функцию GetLastError.

Ниже мы привели пример использоания функции GetMailslotInfo:

BOOL   fReturnCode;

DWORD  cbMessages;

DWORD  cbMsgNumber;

fReturnCode = GetMailslotInfo(hMailslot, NULL, &cbMessages,

  &cbMsgNumber, NULL);



Содержание раздела