Лабораторная работа
Межпроцессорное взаимодействие. С++
Категория: | Лабораторная работа |
Дисциплина: | Системное программирование |
Город: | Беларусь, Минск |
Учебное заведение: | БНТУ, ФИТР |
Тег: | #Системное_программирование |
Стоимость работы: | 16 руб. |
Оценка: | 10 |
Объем страниц: | 5 |
Год сдачи: | 2022 |
Дата публикации: | 14.06.2022 |
* Кроме файла с работой, также есть архив с дополнительными файлами.
Описание дополнительных файлов:
Папка LW-5 — содержит исходный код программы на языке C++
Фрагменты для ознакомления
Лабораторная работа № 5
МЕЖПРОЦЕССОРНОЕ ВЗАИМОДЕЙСТВИЕ
Вариант 06
Цель работы: изучить основы передачи между процессами информации на базе сообщения WM_COPYDATA.
Изучаемые вопросы:
1. Структура COPYDATASTRUCT.
2. Передача текстовой информации.
3. Приём текстовой информации.
4. Передача структурированной информации.
5. Приём структурированной информации
Постановка задачи:
Создать приложение, состоящее из двух процессов:
− первый процесс посылает текстовую и структурированную информацию;
− второй процесс принимает информацию и отображает её в окне процесса.
4.1. Структура COPYDATASTRUCT.
Структура COPYDATASTRUCT содержит данные, которые будут переданы в программу в соответствии с сообщением WM_COPYDATA, примерный вид структуру может быть:
COPYDATASTRUCT cds;
. . . . .
cds.cbData = hFileLen;
cds.lpData = tempBuf;
cds.dwData = COPYDATA_CHAR_ARRAY;
4.2. Передача текстовой информации.
Функция для передачи текстовой информации может иметь вид, представленный ниже. Данная функция открывает и проецирует файл, и передаёт содержимое файла другому окну.
BOOL readTxtFileAndSendWindow(_In_ HWND hDlg, _In_ HWND HwndReceiver, _In_ TCHAR *FileName)
{
COPYDATASTRUCT cds;
HANDLE hFile, hMappingFile;
DWORD dwSizeLow = 0, dwSizeHigh = 0;
LONGLONG hFileLen = 0;
TCHAR strNumber[DATASIZE_NUMBER] = L"",
stringArray[DATASIZE] = L"",
stringCodeError[DATASIZE_BUFFER];
char* lpTchar;
hFile = CreateFileW(FileName, // имя файла
GENERIC_READ, // способ доступа
NULL, // совместный доступ
NULL, // атрибуты доступа
OPEN_EXISTING, // проверка существования
FILE_ATTRIBUTE_NORMAL, // атрибуты не установлены
NULL); // дескриптор временного файла
if (hFile != INVALID_HANDLE_VALUE)
{
// получаем младшее 32-разрядное значение размера файла,
// а старшие 32-бита возвращаются по адресу второго параметра,
// если размер файла превышает 4 Гб
dwSizeLow = GetFileSize(hFile, &dwSizeHigh);
hFileLen = (dwSizeHigh * (MAXDWORD + 1)) + dwSizeLow;
hMappingFile = CreateFileMappingW(hFile, // дескриптор файла
NULL, // атрибуты доступа
PAGE_READONLY, // атрибут защиты
0, // размер файла в виде
0, /*~ 0*/ // 64-разрядного числа
NULL); // имя объекта
CloseHandle(hFile); // закрываем исходный файл
if (hMappingFile != NULL)
{
lpTchar = (char *)MapViewOfFile(hMappingFile, // дескриптор проекции файла
FILE_MAP_READ, // доступ к данным
0, // смещение в файле для отображения
0, // как 64-битное представление
0);/*~ fSize*/ // размер представления
CloseHandle(hMappingFile); // закрываем объект проекции ядра
...
4.3. Приём текстовой информации.
Во втором процессе происходит обработка сообщения COPYDATA. Примерный вид обработки данного сообщения:
…
4.4. Передача структурированной информации.
Мною была придумана структура, которая хранится в файле Company.h:
…
4.5. Приём структурированной информации.
Код приёма структурированной информации:
…
Результаты работы программного обеспечения:

:

Выводы:
1. Если известен дескриптор окна загруженного в память процесса, мы можем послать ему сообщение функцией SendMessage();
2. Найти дескриптор окна можно воспользовавшись функцией FindWindow();
3. В операционной системе Windows для обмена данными предусмотрено и специальное сообщение WM_COPYDATA;
…