Главная страница
    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.035 c
11-1084320954
Николай Сергеевич
2004-05-12 04:15
2004.12.26
Проблемы с элементами на форме


14-1102311556
Чеширский Кот из Гондураса
2004-12-06 08:39
2004.12.26
Позвольте представиться


1-1102846034
Dema-X
2004-12-12 13:07
2004.12.26
из юникод в вин


3-1101804595
12345
2004-11-30 11:49
2004.12.26
проблемы с кодировкой


1-1102957836
Павел
2004-12-13 20:10
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский