.
Tuesday 22nd of May 2012    

Информация

Счетчики

Голосование

Лучшая марка телефона
 

Реклама

фильмы онлайн

фильмы онлайн


Создание почтового слота
загрузка...

Механизм почтовых слотов подразумевает наличие почтового ящика. Приложение, создающее почтовый ящик, называется сервером, и ему не обойтись без метода:

function CreateMailslot(MailName : pAnsiChar; MaxMessageSize, ReadTimeout : Cardinal; SecurityAttr : PSecurityAttributes) : THandle;

Здесь MailName - указатель на строку с адресом слота, MaxMessageSize - ограничитель максимальной длины послания в байтах. Если параметру присвоить нулевое значение, ограничения снимаются. Параметр ReadTimeout оказывает влияние на процесс чтения корреспонденции из создаваемого ящика - задает время ожидания в миллисекундах. Если передается 0, то при обращении к пустому ящику функция, читающая корреспонденцию, возвратит результат немедленно. В противном случае она выждет установленный тайм-аут в надежде, что за этот промежуток времени нам кто-нибудь напишет. Для вечного ожидания передайте константу MAILSLOT_WAIT_FOREVER.

Последний параметр SecurityAttr - указатель на структуру атрибутов безопасности. Он имеет смысл только в Windows NT, поэтому в простейшем случае в него передают неопределенный указатель nil. В случае успешного выполнения метод возвращает дескриптор созданного слота, иначе - нулевое значение.

const MailSlotName = '\\.\mailslot\myslot'; //имя c^oTa var

frmMain : TfrmMain;

MailSlot : THandle; //дескриптор будущего почтового ^0Ta

implementation

procedure TfrmMain.FormCreate(Sender: TObject); var ErrorCod : Cardinal;

s : string; begin {coздaниe ^0Ta}

MailSlot:=CreateMailSlot(MailSlotName, 0, MAILSLOT_WAIT_FOREVER, nil); if MailSlot=INVALID_HANDLE_VALUE then //если вызов мeтoдa зaвepшилcя нeyдaчeй begin

ErrorCod:=GetLastError(); //y3HaeM код ошибки

s:=SysErrorMessage(ErrorCod); //pacшифpoвкa ошибки

MessageBox(frmMain.Handle,

PChar(Format('Ошибкa %d'+#13+'%s',[ErrorCod, s])),

PChar('Ошибкa'), MB_ICONERROR+MB_OK);

end; end;

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

ОЕсли сообщение циркулярное (одновременно рассылается всем станциям домена) и архитектура сети - звезда, то размер сообщения MaxMessageSize не должен превышать 400 байт.

Помимо функции создания почтового слота Win32 API способен похвастаться еще двумя методами работы с mailslot. Первый метод позволяет настраивать время тайм-аута ReadTimeOut, а второй информирует нас о состоянии почтового слота.

ПЖвлЭД function SetMailSlotInfo(MailSlot : THandle; ReadTimeOut : Cardinal) :

boolean;

function GetMailSlotInfo(MailSlot : THandle; MaxMessageSize : pointer, var NextSize : cardinal; MessageCount, ReadTimeout : Pointer) : boolean;

Обе функции требуют указать дескриптор интересующего нас слота в параметре MailSlot. В результате выполнения второго метода выдаются следующие данные:

• MaxMessageSize - максимальный размер сообщения в байтах.

• NextSize - размер следующего сообщения; в случае его отсутствия в параметре окажется константа MAILSLOT_NO_MESSAGE.

• MessageCount - общее количество сообщений в слоте.

• ReadTimeOut - выбранное время тайм-аута почтового ящика.

Чтение корреспонденции

Чтение находящихся в почтовом слоте данных возможно только из программы-сервера, создавшей этот слот. Зная дескриптор слота, приложение обращается к нему как к обычному файлу. Для операции чтения подходят как методы Win32 API ReadFile() и ReadFileEx(), так и их наследник - низкоуровневый метод работы с файлами Delphi FileRead(), приведенный в главе 4 «Основы работы с файлами».

Помимо чтения содержимого сообщения мы можем узнать время его отправления при помощи метода FileGetDate().

К сожалению, технология почтовых слотов не позволяет автоматически контролировать получение корреспонденции. Поэтому для организации динамического просмотра почтового слота в приложении-сервере придется применить таймер. Например, можно раз в минуту опрашивать почтовый слот функцией GetMailslotInfo().


загрузка...
 

Самое популярное:

bottom

карта сайта