![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MailSlot
Profik © (2005-10-04 11:54:00)Люди, погибаю вот уже вторую неделю, ПОМОГИТЕ!!! Как моему приложению отловить сообщение с WinMessengera? Ссылок не давайте - у меня все сайты заблокированы кромя этого. Пожалуйста - киньте кусок кода, кто знает. Спасибо большое!
Piter (2005-10-05 18:19:00) [1]Может хватит плодить темы?
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1128090671&n=18
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1128412479&n=4
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1128509833&n=4
Digitman (2005-10-04 15:42:00) [2]
> Profik © (04.10.05 15:34) [7]
если тебе перекрыт "кислород" от msdn.microsoft.com, то
- либо вешайся,
- либо пусть вешается твой админ,
- либо вы оба,
- либо админ открывает тебе как программеру доступ к этому ресурсу, и ты в 6 екунд находишь там ответы на свой вопрос
Profik (2005-10-04 15:38:00) [3]http://torry.net/vcl/lan/comms/almailsl.zip
http://torry.net/vcl/lan/comms/cbmailslot.zip- это типа исходники по работе с майлслотом , я напряг админа их закачать (6кб и 17 кб) - но они не качаються
Profik (2005-10-04 15:34:00) [4]Для Digitmana -
Да причем тут сайты до моей проги - я говорю что не могу найти нужную мне инфу из-за блокировки полезных сайтов. А ссылку ща кину
Digitman (2005-10-04 15:16:00) [5]
> где типа
вот и кидай сюда эту ссылку...
растрясем ее до костей ..
> кинуть кусок кода
тот "кусок кода", что ты "кинул", в теории вроде бы работоспособен, но НИКАКОГО отношения к каим-то там "сайтам" не имеет - разве это не очевидно ?
ГДЕ в этом "куске" какие-то там "сайты", к которым тебя якобы кто-то там не пускает ?!
Profik (2005-10-04 15:09:00) [6]Для WAL -
// устанавливаем глобальные переменные:
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;
Profik (2005-10-04 15:04:00) [7]Я не понимаю твоих наездов. А про блокированые сайты я сказал, потому что вчера мне вместо совета дали ссылку на один сайт, где типа есть похожая инфа - но я то не могу её посмотреть-сайт недоступен!!! Вот потому я и прошу, по возможности кинуть кусок кода, если кто знает.
Digitman (2005-10-04 14:48:00) [8]
> У нас на работе открыты сайты только те, где в адресе есть
> слово Delphi, остальные блокированы
да на здоровье !
Messenger не имеет никакого отношения ни к каким "сайтам".
Profik (2005-10-04 14:39:00) [9]Специально для Digitmana - У нас на работе открыты сайты только те, где в адресе есть слово Delphi, остальные блокированы. Плюс не в одном из них поисковики не работают. И вообще, лучше бы помог советом, а не наежжал!!!
Digitman (2005-10-04 13:50:00) [10]
> все сайты заблокированы кромя этого
не ври.