Шаг 117 - Обмен данными с использованием WM_COPYDATA

Мы с Вами создавали приложение клиента и сервера, которые обмениваются сообщениями. Теперь мы модернизируем данные приложения для обмена данными. В операционной системе Windows есть большое количество возможностей для обмена данными. Один из таких методов использование сообщения WM_COPYDATA. Это сообщение в Windows NT даже может передать данные через границу процессов.

Давайте изменим наш сервер. Сделаем еще одну кнопку для посылки этого сообщения. По нажатию на кнопку, пока будем посылать просто сообщение без параметров.

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.

117_1.gif (10791 b)

В результате появится вот такая функция. 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);
}

То же просто. Копируем строку из буфера и выводим на экран в виде сообщения. Ниже приведена картина неизвесного автора - "Программа в разгар тестирования":

117_2.gif (4709 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 20.02.2000