![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщения (Диалог между двумя приложениями). [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;