Давайте изменим наш сервер. Сделаем еще одну кнопку для посылки этого сообщения. По нажатию на кнопку, пока будем посылать просто сообщение без параметров.
void CServerDlg::OnButton2() { HWND hwnd; hwnd=::FindWindow(NULL,"Client"); if (hwnd != NULL) { ::SendMessage(hwnd,WM_COPYDATA,0,0); } }Теперь клиент должен научиться принимать это сообщение. А здесь нам может помочь Class Wizard, он уже умеет создавать процедуру приема данного сообщения. Нажмите правую кнопку на CClientDlg и выберите пункт меню Add Windows Message Handles.
В результате появится вот такая функция. MessageBeep вписал уже я для того, чтобы почувствовать сообщение :-)))
BOOL CClientDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { MessageBeep(-1); return CDialog::OnCopyData(pWnd, pCopyDataStruct); }
Уже сейчас можно запустить и проверить, что данный механизм работает. Ну что теперь надо идти на сервер и готовить данные к отправке. Пошли !!!
Изменяем код отправки сообщения.
void CServerDlg::OnButton2() { HWND hwnd; hwnd=::FindWindow(NULL,"Client"); COPYDATASTRUCT cd; char buffer[25]; strcpy(buffer,"Hello Client"); cd.lpData=&buffer; cd.cbData= sizeof(buffer); if (hwnd != NULL) { ::SendMessage(hwnd,WM_COPYDATA, 0, (LPARAM) &cd); } }
Как видите нам нужно заполнить структуру COPYDATASTRUCT, указав адрес буфера и размер. После чего адрес структуры передать в сообшение.
Теперь нужно изменить клиента.
BOOL CClientDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCD) { MessageBeep(-1); char buffer[25]; strcpy(buffer,(char *)pCD->lpData); AfxMessageBox(buffer); return CDialog::OnCopyData(pWnd, pCD); }
То же просто. Копируем строку из буфера и выводим на экран в виде сообщения. Ниже приведена картина неизвесного автора - "Программа в разгар тестирования":