Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

MailSlots   Найти похожие ветки 

 
Чапаев ©   (2004-09-16 11:30) [0]

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

//сервер
 
 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.


 
MetalFan ©   (2004-09-16 11:45) [1]


> "\\*\mailslot\"

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


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


> //сервер


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


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


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

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

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


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

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

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

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


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

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


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


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


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


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


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


 
Чапаев ©   (2004-09-16 15:15) [7]

>С другой стороны, почему бы не пользоваться готовым 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 16:33) [8]

"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 writes a 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-25 02:19) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
14-1096822778
KilkennyCat
2004-10-03 20:59
2004.10.31
Мож встретимся в пятницу?


4-1096064034
VereM
2004-09-25 02:13
2004.10.31
Как узнать температру проца в дельфи.


3-1096551759
intaari
2004-09-30 17:42
2004.10.31
Установка BDE вместе с прогой


1-1097735375
Руслана
2004-10-14 10:29
2004.10.31
Подскажите в чем ошибка...


1-1097605384
Peter
2004-10-12 22:23
2004.10.31
Диалог о сохранении при закрытии приложения