Взаимодействие процессов через механизм сообщений, страница 4

                                            LPARAM(@cdsStruct)            //Указатель на структуру для отправки

                                                           ) <>1

                                then

                                            raise Exception.Create('Error sending message');   //Сообщение не отправлено

               GlobalUnlock(hMem);                                           //Разблокировать память

               GlobalFree(hMem);                                              //Удалить блок памяти

except

on E:Exception do                  //Обработка исключительных ситуаций

               MessageDlg(E.Message, mtError,[mbOK],0);

end;

end;

procedure TForm1.ButtonCaptionClick(Sender: TObject);

begin

Caption:=Edit2.Text; //Установить заголовок окна

end;

2. Создаем диалоговое приложение приемника сообщения(см.Visual C++)

3. В описание класса формы добавляем заголовок обработчика событий

type

  TForm1 = class(TForm)

    Cancel: TButton;

  private

    { Private declarations }

    procedure OnCopyData(var msg:TMessage);message WM_COPYDATA;

  public

    { Public declarations }

  end;

4. В раздел реализации добавляем тело процедуры обработчика.

implementation

{$R *.dfm}

procedure TForm1.OnCopyData(var msg:TMessage);

var         strReceived:string;                                 //строка для хранения результата получения даных

            pasStrReceived:string;                             //строка для хранения пришедших данных в формате Паскаля

            strSenderCaption:array[0..255]of char;       //ASCIIZ строка для хранения заголовка окна отправителя

            pasSenderCaption:string;                         //Паскаль строка для хранения заголовка окна отправителя

            wnd:THandle;                                          //Номер окна отправителя

            pCDStruct:PCOPYDATASTRUCT;            //Указатель на переданную структуру

begin

               try

                              pCDStruct:=PCOPYDATASTRUCT(msg.LParam);//Получаем указатель на переданную структуру

                              wnd:=THandle(pCDStruct^.dwData);                      //Получить указатель на окно отправитель

                              GetWindowText(wnd,@strSenderCaption,255);       //Получить заголовок окна отправителя

                              pasSenderCaption:=StrPas(strSenderCaption);      //Преобразовать заголовок в формат строки Паскаля

                              pasStrReceived:=StrPas(pCDStruct^.lpData);        //Преобразовать полученную строку в формат Паскаля

//Сформировать текст диалогового окна

                              strReceived:=Format('Sender:%s'#10#13'Received bytes:%d'#10#13'Received text:%s'#10#13,                                                                    [pasSenderCaption,                pCDStruct^.cbData,                pasStrReceived]);

MessageDlg(strReceived, mtInformation,[mbOK],0);             //Вывести текст сообщения

        except                           //Возникла ошибка - возвращаем флаг "сообщение не обработано"

                On E:Exception do    begin            msg.Result:=0;exit;end;

        end;

        msg.Result:=1;              //Все в порядке – возвращаем флаг – сообщение обработано

end;

5. Тестирование (см. Visual C++)

Индивидуальные задания:

  1. Передать из одной программы в другую текстовый файл.
  2. Передать из одной программы в другую двоичный файл.
  3. Во время набора текста в одной программе одновременно выводить текст в окне другой.
  4. При перемещении окна выводить в другой программе координаты перемещаемого окна.