Лабораторная работа

Межпроцессорное взаимодействие. С++

Категория:

Лабораторная работа

Дисциплина:

Системное программирование

Город:

Беларусь, Минск

Учебное заведение:

БНТУ, ФИТР

Тег:

#Системное_программирование

Стоимость работы:

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;

25