Лабораторная работа №
Тема: Взаимодействие процессов через механизм сообщений.
Цель : Научиться передавать данные и сообщения между процессами локального компьютера.
Содержание отчета:
Теоретические сведения.
Сообщение WM_COPYDATA передается тогда, когда одна программа пересылает данные в другую программу.
Синтаксис
WM_COPYDATA
wParam = (WPARAM) (HWND) hwnd; // дескриптор передающего окна
lParam = (LPARAM) (PCOPYDATASTRUCT) pcds; // указатель на структуру с данными
Параметры
hwnd
Идентифицирует окно, которое передает данные.
pcds
Указывает на структуру COPYDATASTRUCT, которая содержит данные для передачи.
Возвращаемые
значения
Если принимающая программа обрабатывает это сообщение, она должна возвратить
значение ИСТИНА (TRUE); в противном случае она должна возвратить - ЛОЖЬ
(FALSE).
Замечания
Для передачи этого сообщения программа должна использовать функцию SendMessage,
а не функцию PostMessage. Данные, предназначенные для передачи, не
должны содержать указателей или других ссылок на объекты, не доступные для
программы, принимающей эти данные.
До тех пор, пока это сообщение действует, вызванные данные не должны быть
изменены другим потоком процесса пересылки. Принимающая программа должна
принимать во внимание данные только для чтения. Параметр pcds правилен
только в течение обработки сообщения. Принимающая программа не должна
освобождать память, вызванную pcds. Если принимающая программа
обратилась к данным после возврата значения функцией SendMessage, она
должно копировать данные в локальный буфер.
Структура COPYDATASTRUCT содержит данные, которые будут переданы в другую прикладную программу в соответствии с сообщением WM_COPYDATA.
Синтаксис
typedef struct tagCOPYDATASTRUCT
{
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
Элементы
dwData
Устанавливает до 32 битов данных, которые будут переданы в принимающую
прикладную программу.
cbData
Устанавливает размер, в байтах, данных, указанных элементом структуры lpData.
lpData
Указывает на данные, которые будут переданы в принимающую прикладную программу.
Этот элемент структуры может быть значением ПУСТО (NULL).
Реализация в VisualC++:
1.Создаем диалоговое приложение с помощью Wizard’а
2.Помещаем элементы управления IDC_STATIC и IDC_EDIT1, IDC_STATIC, IDC_EDIT2 и IDC_BUTTONCAPTION как показано на рисунке.
3.Создаем обработчик кнопки OK.
void CSenderDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
4.Изменяем текст метода OnOK
void CSenderDlg::OnOK()
{
HWND hWin=NULL; //Номер окна, которому отсылаются данные
HANDLE hMem=NULL; //Номер блока разделяемой памяти
char * lpStr=NULL; //Указатель на зафиксированную область памяти
CString strSend; //Строка для отправления
COPYDATASTRUCT cdsStruct;
try{
hWin=::FindWindow(NULL, //lpszClassName- имя класса окна приемника - неизвестно
"Receiver" //lpszWindowName- заголовок окна приемника
);
if(hWin==NULL) //Приемник не найден
throw "Receiver not found. Please run receiver and try again.\n"; //Вызвать исключительную ситуацию
GetDlgItemText(IDC_EDIT1,strSend); //Получить содержимое элемента управления в строку strSend
if(strSend.IsEmpty()) //Пустая строка
throw "Please enter text and try again.\n";
//Выделить память для строки - память разделяемая и перемещаемая
hMem=GlobalAlloc(GMEM_SHARE|GMEM_MOVEABLE, strSend.GetLength()+1 //Размер блока- длина строки +1 для заключительного символа
);
if(hMem==NULL)
throw "Error allocating memory\n";
lpStr=(char *)GlobalLock(hMem); //Зафиксировать память и получить указатель на нее
if(lpStr==NULL)
throw "Error memory fixation\n";
memcpy(lpStr,(LPCSTR)strSend,strSend.GetLength()+1); //Скопировать строку в разделяемую память
cdsStruct.cbData=strSend.GetLength()+1; //Длина передаваемых данных
cdsStruct.lpData=lpStr; //Указатель на передаваемую область
cdsStruct.dwData=(DWORD)this->m_hWnd; //Номер окна отправителя (для нескольких отправителей)
if(!::SendMessage( //Отослать сообщение окну приемнику
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.