Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сообщения (Диалог между двумя приложениями). [D6, Win2k]


andrey__ ©   (2004-07-07 14:01:00) 

Подскажите как послать из одного приложения сообщение для другого.


Digitman   (2004-07-07 18:05:00) [1]


> Что я не так делаю?
>   h:= FindWindow(Pchar('Application'),Pchar('MainForm'));т.к.
> h выдаёт =0.


h:= FindWindow(Pchar('имя_класса_формы'),Pchar('подпись_формы'));


> там не описано как их делать


SendMessage(HWND_BROADCAST, ..);

а вообще говоря интерпроцессные коммуникации с пом. оконных сообщений между "своими" приложениями - плохое решение

на то существуют программные каналы и файлы отображенные в память


andrey__   (2004-07-07 17:53:00) [2]

Что я не так делаю?
  h:= FindWindow(Pchar('Application'),Pchar('MainForm'));т.к. h выдаёт =0.

>это как? честно говоря, первый раз о таких слышу.

Вычитал в книге Delphi 5 "Руководство программиста" Ксавье Паченко и Стив Тейксейра т.1 (гл. 5 разд "обмен сообщ между приложениями") Если есть. Только там не описано как их делать.


ssk   (2004-07-07 17:25:00) [3]

>широковещательные сообщения

это как? честно говоря, первый раз о таких слышу.


andrey__   (2004-07-07 17:16:00) [4]

Подскажи как посылать широковещательные сообщения (между приложениями).


ssk   (2004-07-07 16:43:00) [5]

FindWindow()


andrey__   (2004-07-07 16:05:00) [6]

Удалено модератором
Примечание: Создание пустых сообщений


andrey__   (2004-07-07 14:49:00) [7]

>ssk ©   (07.07.04 14:11) [1]

Как мне узнать в посылающем сообщение приложении DestinationWindow(Окно Адресата) для
function SendDataToApplication(SourceWindow, DestinationWindow: HWND; s: string): boolean;


NAlexey   (2004-07-07 14:12:00) [8]

>ssk ©   (07.07.04 14:11) [1]
Можно и так, но возможны взаимные блокировки.


ssk   (2004-07-07 14:11:00) [9]

это нужно?


// передача строки другому приложению
function SendDataToApplication(SourceWindow, DestinationWindow: HWND; s: string): boolean;
type
 PCopyDataStruct = ^TCopyDataStruct;
 TCopyDataStruct = record
   dwData: LongInt;
   cbData: LongInt;
   lpData: Pointer;
 end;
type
 PRecToPass = ^TRecToPass;
 TRecToPass = packed record
   s : string[255];
   i : integer;
 end;
var
 h : THandle;
 cd : TCopyDataStruct;
 rec : TRecToPass;
begin
 h:=DestinationWindow;
 rec.s := s;
 rec.i := Length(rec.s);
 cd.dwData := Length(rec.s);
 cd.cbData := sizeof(rec);
 cd.lpData := @rec;
 Result:=False;
 if h <> 0 then
   begin
     SendMessage(h, WM_COPYDATA, SourceWindow, LongInt(@cd));
     Result:=True;
   end;


// обработка данных приложением-приемником

 {
 private
   procedure WMCopyData(var m : TMessage); message WM_COPYDATA;

 ...

 procedure TForm1.WMCopyData(var m : TMessage);
 type
   PCopyDataStruct = ^TCopyDataStruct;
   TCopyDataStruct = record
     dwData: LongInt;
     cbData: LongInt;
     lpData: Pointer;
   end;
 type
   PRecToPass = ^TRecToPass;
   TRecToPass = packed record
     s : string[255];
     i : integer;
   end;
 begin
   Memo1.Lines.Add('Sending Window Handle := ' + IntToStr(m.WParam));
   Memo1.Lines.Add('Data Size := ' + IntToStr(PCopyDataStruct(m.LParam)^.cbData));
   Memo1.Lines.Add('User Defined Data Param := ' + IntToStr(PCopyDataStruct(m.LParam)^.dwData));
   Memo1.Lines.Add('TRecToPass.s := ' + PRecToPass(PCopyDataStruct(m.LParam)^.lpData)^.s);
   Memo1.Lines.Add('TRecToPass.i := ' + IntToStr(PRecToPass(PCopyDataStruct(m.LParam)^.lpData)^.i));
 end;
 }
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо