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

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

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

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

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

                                            ))

                              throw "Error sending message";                            //Сообщение не отправлено

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

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

}

catch(char * error)                                                                             //Обработка собственных исключительных ситуаций

{

               AfxMessageBox(error,MB_ICONERROR,0);

}

catch(CException * e)                                                                        //Обработка стандартных исключительных ситуаций

{

               char lpszError[255];

               e->GetErrorMessage(lpszError,sizeof(lpszError));

               e->Delete();

               AfxMessageBox(lpszError,MB_ICONERROR,0);

}

catch(...)                                                                                          //Обработка остальных исключительных ситуаций

{

                              AfxMessageBox("Unexpected error. Please send report to john@kpi.kharkov.ua\n",MB_ICONERROR,0);

}

}

5. Создаем обработчик кнопки IDC_BUTTONCAPTION и модифицируем его

void CSenderDlg::OnButtoncaption()

{

CString strCaption;

               GetDlgItemText(IDC_EDIT2,strCaption);                //Получить текст из второй строки редактирования

               SetWindowText(strCaption);                                                //Установить заголовок окна

}

6. Создаем второе диалоговое приложение:

            Выполняем File/New. Выбираем закладку Projects. MFC App wizard(exe). Называем приложение Receiver. Выбираем радио элемент “Add to current workspace”. Нажимаем OK и создаем диалоговое приложение с окном как на рисунке.

Для переключения между проектами на закладке “Class View” на требуемом проекте нажимаем правую кнопку мыши и выбираем “Set as active project”.

7.Создаем обработчик сообщения WM_COPYDATA.

Запускаем View/Class Wizard и, убедившись, что в комбобоксе «Class name» выбран класс диалогового окна, находим в списке «Messages»  сообщение WM_COPYDATA. Создаем для него обработчик и модифицируем его.

BOOL CReceiverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)

{

CString strReceived;

CString strSenderCaption;

CWnd *wnd;

try{

wnd=CWnd::FromHandle((HWND)pCopyDataStruct->dwData);              //Получить указатель на окно отправитель

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

strReceived.Format("Sender:%s\nReceived bytes:%d\nReceived text:%s\n",//Сформировать текст диалогового окна

                                                           strSenderCaption,

                                                           pCopyDataStruct->cbData,     //Количество байт сообщения

                                                           pCopyDataStruct->lpData);     //Данные сообщения