

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Создание почтового слота |
|
Механизм почтовых слотов подразумевает наличие почтового ящика. Приложение, создающее почтовый ящик, называется сервером, и ему не обойтись без метода: 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(). |
