Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизMailSlot Найти похожие ветки
← →
Profik © (2005-10-05 17:55) [0]Программеры!!!!! Есть у кого нибудь соображения как получить сообщение с Winmessengera на свою прогу. Вторую неделю парюсь - никто не знает, в нэте кроме статеек про MailSlot ниче нету. статейки не плохие - но код сних не пашет на прием сообщений с винмесса, а только на отсылку. Есть хоть у кого нибудь идеи?
← →
Leonid Troyanovsky © (2005-10-06 08:48) [1]
> Profik © (05.10.05 17:55)
> сообщение с Winmessengera на свою прогу. Вторую неделю парюсь
> - никто не знает, в нэте кроме статеек про MailSlot ниче
> нету. статейки не плохие - но код сних не пашет на прием
> сообщений с винмесса, а только на отсылку. Есть хоть у кого
> нибудь идеи?
Идея очень простая.
За 2 недели можно написать свой вариант messenger, обладающий
желаемой функциональностью.
И можно оставить в покое сам messenger, который успешно справляется
со своими задачами.
--
Regards, LVT.
← →
clickmaker © (2005-10-06 10:38) [2]CreateMailslot("\.\\mailslot\messngr"
и почему не пашет? код напиши
← →
Profik © (2005-10-06 10:53) [3]Для Leonid Troyanovsky -
стандартный винмес- отстой в том плане, что когда нада отправить одно сообщение к примеру 30-40 клиентам в сети - надо либо набирать в адресате через кому все имена хостов, либо 40 раз отсылать отдельно каждому. А если такое надо проделывать раз 5 - 10 в день - будешь материться. а моя прога уже сделана - отсылает без проблем на стандартный винмес сообщение заранее созданой группе, но не может получить от винмеса ответ.
Для clickmaker -
// устанавливаем глобальные переменные:
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;
← →
Игорь Шевченко © (2005-10-06 11:07) [4]
> стандартный винмес- отстой
> а моя прога уже сделана ... но не может получить
> от винмеса ответ.
И что есть отстой ?
← →
Игорь Шевченко © (2005-10-06 11:24) [5]Спамить не надо
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.036 c