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

AfxMessageBox(strReceived,MB_ICONINFORMATION,0);                  //Вывести текст сообщения

      }

catch(...)                

{

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

}

return true;                             //Все в порядке - возвращаем истину

}

Проверка:

Запускаем несколько копий программы – отправителя, изменяем у каждой заголовок и текст отправляемого сообщения.

Проверяем работу.

Запускаем одну программу приемника.

Нажимаем по очереди кнопки OK у отправителя закрывая диалоговое окно сообщения о приеме у приемника.

Нажимаем по очереди кнопки OK у отправителя не закрывая диалоговое окно сообщения о приеме у приемника.

Реализация в BorlandDelphi:

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

Текст обработчиков приведен ниже.

procedure TForm1.OkButtonClick(Sender: TObject);

var          hWin:THandle;        //Номер окна, которому отсылаются данные

               hMem:THandle;       //Номер блока разделяемой памяти

               lpStr:pointer;           //Указатель на зафиксированную область памяти

               strSend:string;        //Строка для отправления

cdsStruct:COPYDATASTRUCT;

begin

try

               hWin:=FindWindow(nil,                          //lpszClassName- имя класса окна приемника - неизвестно

                                             'Receiver'              //lpszWindowName- заголовок окна приемника

                        );

               if hWin=0 then                                      //Приемник не найден

//Вызвать исключительную ситуацию

                              raise Exception.Create('Receiver not found. Please run receiver and try again.');  

               strSend:=Edit1.Text;              //Получить содержимое элемента управления в строку strSend

               if strSend='' then                    //Пустая строка

                              raise Exception.Create('Please enter text and try again.');

//Выделить память для строки - память разделяемая и перемещаемая

               hMem:=GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE,              

//Размер блока- длина строки +1 для заключительного символа

                                            Length(strSend)+1

                                            );

               if hMem=0 then

                              raise Exception.Create('Error allocating memory');

               lpStr:=GlobalLock(hMem);          //Зафиксировать память и получить указатель на нее

               if lpStr=nil then

                              raise Exception.Create('Error memory fixation');

               StrPCopy(lpStr,strSend);        //Скопировать строку в разделяемую память

               cdsStruct.cbData:=Length(strSend)+1;                  //Длина передаваемых данных

               cdsStruct.lpData:=lpStr;                                       //Указатель на передаваемую оббласть

               cdsStruct.dwData:=Cardinal(Handle);                    //Номер окна отправителя(для нескольких отправителей)

               if SendMessage(                                                 //Отослать сообщение окну приемнику

                                             hWin,                                    //Номер окна приемника

                                            WM_COPYDATA,                  //Отправить с помощью сообщения WM_COPYDATA

                                            WPARAM(hWin),                   //Номер окна приемника