Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.48 MB
Время: 0.094 c
1-1098080595
Uran
2004-10-18 10:23
2004.10.31
delphi5 в delphi7


4-1096106992
Alexander K.
2004-09-25 14:09
2004.10.31
Работа с корзиной


3-1096477969
mid
2004-09-29 21:12
2004.10.31
function based индекс в oracle


10-1055742436
kors
2003-06-16 09:47
2004.10.31
COM


3-1096621509
msguns
2004-10-01 13:05
2004.10.31
MSACCESS. Ошибка синтаксиса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский