Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.028 c
2-1132658005
barakuda
2005-11-22 14:13
2005.12.11
Image +


14-1132286700
Учусь
2005-11-18 07:05
2005.12.11
Зачем нужны коллекции?


2-1132570964
Apachi
2005-11-21 14:02
2005.12.11
TWebBrowser как прочитать содержимое


14-1132125094
Mike Kouzmine
2005-11-16 10:11
2005.12.11
Арестована коллекция Пушкинского музея.


5-1116849129
PavelP
2005-05-23 15:52
2005.12.11
Как получить список контролов