Delphi: обмен данными между приложениями

КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"

[Главная страница] [Delphi] [Контакты]

Обмен сообщенями между двумя приложениями


щ5 

Для демонстрации процесса обмена сообщениями спроектируем два небольших приложения: первое – приемник, второе – отправитель сообщений. Начнем с приема.

Создайте новое приложение и сохраните его в отдельный каталог под именем receiver.dpr. Приложение не содержит ни одного элемента управления и его листинг включает лишь секцию инициализации и две процедуры:

unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TfrmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure OnMessage_Event(var Msg: TMsg; var Handled: Boolean);
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  WM_MSG1, WM_MSG2 : Cardinal; //здесь будем хранить идентификаторы сообщений

implementation

{$R *.dfm}

{ TfrmMain }

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.OnMessage := OnMessage_Event;
end;

procedure TfrmMain.OnMessage_Event(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := True;
  if Msg.message = WM_MSG1 then
    ShowMessage('Сообщение от sender: WM_MSG1')
  else if Msg.message = WM_MSG2 then
    ShowMessage('Сообщение от sender: WM_MSG2')
  else
    Handled:=False;
end;

initialization
  {регистрация в Windows двух пользовательских сообщений}
  WM_MSG1 := RegisterWindowMessage('WM_MSG1');
  WM_MSG2 := RegisterWindowMessage('WM_MSG2');

end.

В момент инициализации приложение регистрирует два пользовательских сообщения, а результаты регистрации помещает в две переменные WM_MSG1 и WM_MSG2. Обслуживанием поступающих сообщений занимается процедура OnMessage_Event(). Тело процедуры содержит код, определяющий реакцию приложения на поступление пользовательских сообщений. Эта процедура активизируется во время создания главной формы; в этот момент указывается, что обработка события OnMessage() перенаправляется в процедуру OnMessage_Event(). Откомпилируйте и сохраните проект приемника.

Переходим к разработке программы передатчика сообщений. Создайте новое приложение и разместите на поверхности главной формы две кнопки Button1 и Button2. Повторите исходный код, предложенный в следующем листинге:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  WM_MSG1, WM_MSG2 : Cardinal;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  h:hWnd;
begin
  h := FindWindow(nil, 'receiver'); // поиск главного окна приложения
  // с названием receiver
  if h > 0 then // если окно обнаружено
    PostMessage(h, WM_MSG1, Application.Handle, 0); // отправляем ему
                                                    // сообщение WM_MSG1
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  h: hWnd;
begin
  h := FindWindow(nil, 'receiver');
  if h > 0 then
    PostMessage(h, WM_MSG2, Application.Handle, 0);
end;

initialization
  {регистрация в Windows двух пользовательских сообщений}
  WM_MSG1 := RegisterWindowMessage('WM_MSG1');
  WM_MSG2 := RegisterWindowMessage('WM_MSG2');

end.

Программа-передатчик регистрирует сообщения, идентичные описанным в коде проекта receiver.dpr. Это гарантирует, что программа-приемник будет «общаться» с передатчиком на одном языке. В обработчике события OnClick() первой кнопки при помощи функции FindWindow() осуществляется поиск главного окна приложения с именем «receiver», и, если оно обнаружено, в адрес этого окна (с помощью функции PostMessage()) отправляется соответствующее пользовательское сообщение.

Исходный код проекта (Delphi XE)

Используемая литература: Delphi. Профессиональное программирование. Дмитрий Осипов.