![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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?