Форум: "WinAPI";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c