Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MailSlots [D7]


Чапаев ©   (2004-09-16 11:30:00) 

Есть такой код:

//сервер
 
 hPipe:=CreateNamedPipe('\\.\pipe\'+PipeName,
                        PIPE_ACCESS_OUTBOUND,
                        PIPE_TYPE_MESSAGE or PIPE_NOWAIT,
                        1,
                        1000000,
                        1000000,
                        NMPWAIT_USE_DEFAULT_WAIT,
                        nil);
 if hPipe=INVALID_HANDLE_VALUE then begin
   MessageBox(0,'Can''t create named pipe','Error',MB_OK or MB_ICONSTOP or MB_APPLMODAL);
   Application.Terminate;
 end;
 hMailSlot:=CreateMailSlot('\\.\mailslot\'+MailSlotName,0,0,nil);
 if hMailSlot=INVALID_HANDLE_VALUE then begin
   MessageBox(0,'Can''t create mailslot','Error',MB_OK or MB_ICONSTOP or MB_APPLMODAL);
   Application.Terminate;
 end;
 Size:=MAX_COMPUTERNAME_LENGTH;
 GetComputerName(CompName,Size);
 Tmp:=CreateFile(PAnsiChar('\\*\mailslot\'+MailSlotName),GENERIC_WRITE,FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
 if not WriteFile(Tmp,CompName,Size,ActWrite,nil) then begin
   MessageBox(0,'Can''t write to mailslot','Error',MB_OK or MB_ICONSTOP or MB_APPLMODAL);
   Application.Terminate;
 end;


//клиент

 hMailSlot:=CreateFile('\\*\mailslot\'+MailSlotName,GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
 if hMailSlot=INVALID_HANDLE_VALUE then begin
   MessageBox(0,'Can''t open mailslot','Error',MB_OK or MB_ICONSTOP or MB_APPLMODAL);
   Application.Terminate;
 end;
 if not ReadFile(hMailSlot,CompName,MAX_COMPUTERNAME_LENGTH,ActRead,nil) then begin
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,GetLastError,0,Msg,256,nil);
   MessageBox(0,Msg,'Error',MB_OK or MB_ICONSTOP or MB_APPLMODAL);
   Application.Terminate;
 end;
 MessageBox(0,CompName,'Server',MB_OK or MB_ICONINFORMATION or MB_APPLMODAL);
 hPipe:=CreateFile(PAnsiChar('\\'+CompName+'\pipe\'+PipeName),GENERIC_READ,0,nil,OPEN_EXISTING,0,0);
 if hPipe=INVALID_HANDLE_VALUE then begin
   MessageBox(0,'Can''t open named pipe','Error',MB_OK or MB_ICONSTOP or MB_APPLMODAL);
 end else
   Timer1.Enabled:=True;


И вот при вызов ReadFile() неизбежно возвращает False. Как и GetMailSlotInfo(). Ошибка Invalid function.


венн   (2004-09-25 02:19:00) [1]

в продолжение темы о майлслотах... Создаю слот - записываю в него данные (строка формируется из значений двух Edit'ов), потом - читаю из него (вроде б все нормально) и тут, когда значение, прочитанное из слота должно записаться в Мемо - выдается ошибка о EAccessViolation... Может кто помочь? Ежели у кого такое желание возникнет - вышлю исходник (мыло только свое дайте, чтоб ему до вас скользилось лучче ;). Может, я чой-то не так делаю, когда записываю данные? Или это все-таки что-то я с ReadFile не так делаю? Помогите, плиз... Заранее благодарен...


Игорь Шевченко   (2004-09-16 16:33:00) [2]

"A mailslot server is a process that creates and owns a mailslot. When the server creates a mailslot, it receives a mailslot handle. This handle must be used when a process reads messages from the mailslot. Only the process that creates a mailslot or has obtained the handle by some other mechanism (such as inheritance) can read from the mailslot. All mailslots are local to the process that creates them; a process cannot create a remote mailslot."
"A mailslot client is a process that writesa message to a mailslot. Any process that has the name of a mailslot can put a message there. New messages follow any existing messages in the mailslot."
http://msdn.microsoft.com


Чапаев   (2004-09-16 15:15:00) [3]

>С другой стороны, почему бы не пользоваться готовым Handle для MailSlot ?
В смысле, hMailSlot? Ошибка записи.

>Насколько я помню, клиент может только писать в mailslot. Опять ошибаюсь ?
Хелп лаконично говорит по поводу чтения, что "An application must specify the FILE_SHARE_READ flag when using CreateFile to retrieve a client handle to a mailslot."


Игорь Шевченко   (2004-09-16 15:02:00) [4]


> Не понял, честно говоря. Я создаю на сервере слот CreateMailSlot(),
> потом открываю его на сервере же как файл CreateFile(),
> затем записываю в него имя сервера


Прощу прощения, не заметил :)
С другой стороны, почему бы не пользоваться готовым Handle для MailSlot ?


> //клиент
if not ReadFile(hMailSlot,CompName,MAX_COMPUTERNAME_LENGTH,ActRead,nil) then begin


Насколько я помню, клиент может только писать в mailslot. Опять ошибаюсь ?


Чапаев   (2004-09-16 14:10:00) [5]

Не понял, честно говоря. Я создаю на сервере слот CreateMailSlot(), потом открываю его на сервере же как файл CreateFile(), затем записываю в него имя сервера.


Игорь Шевченко   (2004-09-16 13:59:00) [6]

Чапаев ©   (16.09.04 13:34) [3]

Так виноват, на сервере этот код не должен создавать сервер mailslot'а, а должен действовать, как обычный клиентский запрос к mailslot'у с определенным именем.

Я сильно в чем-то ошибаюсь ?


Чапаев   (2004-09-16 13:34:00) [7]

>а что значит * в имени mailslot'a?
Все мейлслоты с данным именем в пределах домена

>и что, работает ? На сервере ?
Да. Порядком пришлось поколупаться в хелпе, пока я понял, что на сервере кроме создания слота его ещё и надо открыть как файл.


Игорь Шевченко   (2004-09-16 12:52:00) [8]


> //сервер


>  Tmp:=CreateFile(PAnsiChar('\\*\mailslot\'+MailSlotName),GENERIC_WRITE,FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);


и что, работает ? На сервере ?


MetalFan   (2004-09-16 11:45:00) [9]


> '\\ *\mailslot\'

а что значит * в имени mailslot'a?


Наверх

Титульная страница Поиск, карта сайта Написать письмо