Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

Работа с мэйлслотами   Найти похожие ветки 

 
NetDigger ©   (2004-11-15 08:45) [0]

Здравствуйте, уважаемые!

Возник вопрос при работе с мэйлслотами. Есть приложение, которое может выступать либо как клиент, либо как сервер. При запуске сервера открывается мэйлслот-канал, теперь запустив ту же самую программу с помощью кнопки Send можно посылать сообщения серверу, который их, допустим, выводит в ShowMessage. Это теоретически. На практике получается так: если строка задается константой, т.е. идет присвоение типа Message := "test", то все замечательно работает, но стоит попробовать присвоить текст какого-либо контрола (Edit1.Text) - все вылетает c Acces Violation. Грешил на Вин98, однако на винтукее то же самое. Как только не извращался с типами, добавлял насильно нуль в конец строки - БЕС-ПО-ЛЕЗ-НО. Потом решил разделить клиент и сервер - штука точна такая же - не получается. Посмотрите незамыленным глазом - может подскажете, где собака зарыта. И еще - подскажите как то же самое можно реализовать с Named Pipes, сокетами и DDE - вдруг получится там =). Но код с мэйлслотами все равно доделать нужно.



procedure TForm1.Button3Click(Sender: TObject); - создаем сервер
Var
szBuf: String; // само сообщение
cbMsgNumber: DWORD; // количество сообщений в слоте
cbMessages: DWORD;
cbRead: DWORD;// байт прочтено
HS : THandle;
begin
HS := CreateMailSlot(PChar("\\.\mailslot\MySlot"), 0, MAILSLOT_WAIT_FOREVER,nil);
if HS = INVALID_HANDLE_VALUE then
  raise Exception.Create("MailSlotServer: ни черта не создан!");
While( true ) do begin
  If not(GetMailslotInfo( hs, nil, cbMessages, @cbMsgNumber, nil))
        then Halt;
If cbMsgNumber  <> MAILSLOT_NO_MESSAGE then Begin // если есть сообщение-вывести и  выйти из цикла
     ReadFile(hs, szBuf, 200, cbRead, nil);
        ShowMessage( szBuf );
      break;
  End;

End;
 ShowMessage("The message has been showed");
end;

procedure TForm1.Button2Click(Sender: TObject);// а вот посылка сообщения
Var
StrMess : String;
Written: DWORD;
blank: String;
  hC: THandle;
begin
hc:=CreateFile( PChar("\\.\mailslot\MySlot"), GENERIC_WRITE,
               FILE_SHARE_READ,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
If Hc <> INVALID_HANDLE_VALUE then Begin
StrMess := Edit1.text;
  If not(WriteFile(hc,strmess,Length(StrMess)+1, written,nil)) then
    ShowMessage("laja");
  CloseHandle(hc);
End;
end;


 
Игорь Шевченко ©   (2004-11-15 10:37) [1]

http://www.delphimaster.ru/articles/named_pipes/index.html



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

Форум: "WinAPI";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.047 c
1-1102863512
Илья
2004-12-12 17:58
2004.12.26
FileRead даёт результат -1


10-1072286014
Mozg
2003-12-24 20:13
2004.12.26
Переход с Delphi5 + Visibroker 3 на Delphi 7 + Visibroker4


1-1102503215
Provodnick
2004-12-08 13:53
2004.12.26
Отключение Cntrl+Tab в MDI-формах.


1-1103043697
Sam Stone
2004-12-14 20:01
2004.12.26
Объект в объекте


3-1101664691
Lexa
2004-11-28 20:58
2004.12.26
Обновление





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский