Отправка и получение WinPopup сообщений


Долго искал в интернете описание протокола WinPopup, нашел только как использовать здесь http://dmess.ytu.ru/rus/odsendrecieve.shtml, советую посмотреть программу для общения с этого сайта. Надо было искать по ключевому слову "mailslot", но кто знал. Привожу тот пример как есть.

// устанавливаем глобальные переменные: var MailslotHandle:Word; MSlotName:String; ComputerName:String; // функция отпpaвки сообщения: function SendMessage(ToComputer, Msg:string): boolean; var hToSlot:THandle; BytesWritten:DWord; FullSlot, Data:String; SendMsg:string; begin Result:=false; SendMsg:=copy(Msg,1,length(Msg)); CharToOEM(PChar(SendMsg), PChar(SendMsg)); // необходимо чтобы поняли по pyсски. Data:=ComputerName+#0+ToComputer+#0+SendMsg; // собирам сообщение для отправки FullSlot:='\\'+ToComputer+'\mailslot\'+MSlotName; // собираем имя mailslot'а hToSlot:=CreateFile(PChar(FullSlot), // создаём файл, для записи данных GENERIC_WRITE, FILE_SHARE_READ, NIL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if hToSlot<>INVALID_HANDLE_VALUE then begin BytesWritten:=0; If (NOT WriteFile(hToSlot, Pointer(Data)^, Length(Data), BytesWritten, NIL)) OR (BytesWritten <> Length(Data)) then Result:=false Else Result:=true; // если не удалось записать данные или размер записанных данных // и данных подготовленых для отправки не совпадает то вернуть ложное значение. end; // hToSlot<>INVALID_HANDLE_VALUE end; // процедура чтения: procedure ReadMessage(NextMsgSize:DWord); var Newline,Sender,Recip,Msg:String; MsgSize:DWord; begin SetLength(NewLine,NextMsgSize); ReadFile(MailslotHandle, PChar(NewLine)^, NextMsgSize, MsgSize, nil); Sender:=lowercase(Copy(newline,1,pos(chr(0),newline)-1)); Sender[1]:=upcase(sender[1]); Delete(newline,1,Pos(chr(0),newline)); // определение получателя Recip:=lowercase(Copy(newline,1,pos(chr(0),newline)-1)); Recip[1]:=upcase(Recip[1]); Delete(newline,1,Pos(chr(0),newline)); // всё что осталось - сообщение Msg:=TrimLeft(TrimRight(newline)); OEMToChar(PChar(Msg),PChar(Msg)); // чтобы понять pyсские символы. Form1.Memo1.Lines.Add(Sender+' сообщил для '+Recip+' вот что:'+Msg); end; // в тaймеp с интеpвaлом в 200мс (можно меньше, но зaчем?) встaвляем: procedure TForm1.Timer1Timer(Sender: TObject); var NextMsgSize, MsgSize, MsgCount:DWord; NewLine:String; DummyBuffer:Char; begin NextMsgSize:=0; MsgSize:=0; GetMailSlotInfo(MailslotHandle, NIL, NextMsgSize, @MsgCount, NIL); If NextMsgSize<>MAILSLOT_NO_MESSAGE then begin if NextMsgSize>5 then ReadMessage(NextMsgSize) // по формату сообщение не может быть меньше 5 символов, даже от компьютера, // чьё имя состоит из одной буквы. Else ReadFile(MailslotHandle, DummyBuffer, NextMsgSize, MsgSize, nil); // считываем в ненужный буфер чтобы сообщение не лежало в слоте. end; end; // функция получения имени компьютера function GetComputerName:String; var N: Cardinal; Buf: array [0..MAX_COMPUTERNAME_LENGTH + 1] of AnsiChar; begin N:=SizeOf(Buf)-1; Windows.GetComputerName(Buf, N); Result:=PChar(@Buf[0]); end; // нa создание главной формы: procedure TForm1.FormCreate(Sender: TObject); var MSlotCreate:String; Error:Dword; begin ComputerName:=Uppercase(GetComputerName); MSlotName:='messngr'; // messngr - майлслот службы сообщений. MSlotCreate:='\\.\mailslot\'+MSlotName; MailslotHandle:=0; Error:=0; SetLastError(0); MailslotHandle:=CreateMailSlot(PChar(MSlotCreate), 0, MAILSLOT_WAIT_FOREVER, nil); Error:=GetLastError(); if (Error<>0) or (MailslotHandle=0) or (MailslotHandle=INVALID_HANDLE_VALUE) then begin ShowMessage('Пожалуйста перед запуском закройте все программы - аналоги winpopup'+#13#10+ 'или остановите службу сообщений.'); Application.Terminate; end; end; // отпpaвление сообщения в любом месте программы чтобы отправить // сообщение к примеру компьютеру VASYA: if SendMessage('VASYA','здарова! негритёнок!')=true then ShowMessage('сообщение отправлено!'); // Если же комy - '*' отправляется всем в ТЕКУЩЕМ домене, а на них (домены или рабочие группы) отправлять точно так же как и на компьютеры.

Хостинг от uCoz