Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.043 c
3-1130478768
Трегубов Александр
2005-10-28 09:52
2005.12.11
LEFT OUTER JOJN


1-1131810203
Nikos
2005-11-12 18:43
2005.12.11
Ошибка возведения числа в квадрат


1-1131807098
Dmitrich
2005-11-12 17:51
2005.12.11
Копирование экрана


2-1132918235
Quadro
2005-11-25 14:30
2005.12.11
Странная ошибка


3-1130411409
diwww
2005-10-27 15:10
2005.12.11
Получить позицию первой выводимой записи в DBGrid-е





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский