Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
-35 / 0 / 0
Регистрация: 15.02.2021
Сообщений: 72

Управление процессами, передача данных между процессами

13.09.2021, 20:37. Показов 4343. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Постановка задачи
1. Осуществить обмен текстовыми и графическими данными между двумя приложениямиP1 и P2 с выводом информации в заданную область окна программы.
2. Реализовать обработку процессом файлов больших размеров.
3. Осуществить обмен данными между двумя приложениями P1 и P2 через Page файл с выводом информации в заданную область окна программы.
Теоретические сведения
Функции для работы с файлами, отображаемыми в память
Функция CreateFile позволяет процессу открывать файл, проецируемый в память другим процессом:
C++
1
2
hTxtFile =
CreateFileW(L"kate.txt",GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
54
Функция CreateFileMapping создаёт уже другие, «проецирующие» внутренние структуры и связывает «сущность на диске» с «сущностью в адресном пространстве»:
C++
1
2
//Создание объекта ядра «проекция файла»
hTxtMappingFile=CreateFileMappingA(hTxtFile,NULL,PAGE_READONLY,0,0,"kate");
По своему месту в последовательности действий она создаёт чтото наподобие «адресного пространства из файла». Этот объект поддерживает соответствие между содержимым файла и адресным пространством процесса, использующего этот файл (“kate” – имя объекта файлового отображения). Так как мы хотим отобразить весь файл, то четвертый и пятый параметры должны быть равны нулю. Функция MapViewOfFile делает "проекцию в память":
C++
1
2
//Проецирование данных файла на адресное пространство процесса
hTxtMapFileStartAddr = MapViewOfFile(hTxtMappingFile,FILE_MAP_READ,0,0,0);
Здесь hTxtMappingFile – дескриптор созданного объекта файлового отображения. Второй параметр определяет режим доступа к файлу. Значение, возвращаемое функцией MapViewOfFile, имеет тип "указатель". Если функция отработала успешно, то она вернет начальный адрес данных объекта файлового отображения. Функция OpenFileMapping используется для открытия объекта ядра «проекция файла»:
C++
1
2
//Открытие объекта ядра «проекция файла»
hTxtMappingFile = OpenFileMappingA(FILE_MAP_READ,FALSE,"kate");
Функция UnmapViewOfFile прекращает отображение в адресное пространство процесса того файла, который перед этим был отображен при помощи функции MapViewOfFile:
C++
1
UnmapViewOfFile(hTxtMapFileStartAddr);
55
Файлы данных, проецируемые в память
Операционная система позволяет проецировать на адресное пространство процесса и файл данных. Это очень удобно при манипуляциях с большими потоками данных.
Для проецирования файла данных нужно выполнить три операции:
1. Создать или открыть объект ядра "файл", идентифицирующий дисковый файл, который Вы хотите использовать как проецируемый в память. Для создания объекта “файл” используется функция CreateFile .
2. С помощью функции CreateFileMapping создается объект ядра “проецируемый файл”, чтобы сообщить системе размер файла и способ доступа к нему. При этом используется описатель файла (handle), возвращенный функцией CreateFile. Теперь файл готов к проецированию.
3. Производится отображение объекта “проецируемый файл” или его части на адресное пространство процесса. Для этого применяется функция MapViewOfFile.
Для открепления файла от адресного пространства процесса используется функция UnmapViewOfFile, а для уничтожения объектов “файл” и “проецируемый файл” – функция CloseHandle.
Общая схема работы с проецированными файлами такова:
C++
1
2
3
4
5
6
//Открытие объекта ядра «файл»
hTxtFile = CreateFileW(L"kate.txt",…);
//Создание объекта ядра «проекция файла»
hTxtMappingFile=CreateFileMappingA(hTxtFile,…,"kate");
//Проецирование данных файла на адресное пространство процесса
hTxtMapFileStartAddr = MapViewOfFile(hTxtMappingFile,…);
Совместный доступ процессов к данным через механизм проецирования
Совместное использование данных в этом случае происходит так: два или более процесса проецируют в память представления одного и того же объекта "проекция файла", т.е. одни и те же страницы физической памяти. В результате, когда один процесс записывает данные в представление общего объекта "проекция файла", изменения немедленно отражаются на представлениях в других процессах. Но при этом все процессы должны использовать одинаковое имя объекта "проекция файла".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
case WM_INITDIALOG:
1.exe
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1000, TEXT("katarina"));
if(hFileMapping == NULL)
MessageBox(hDlg,TEXT("Невозможно создать проекцию файла в Page-файле..."),TEXT("Error"),MB_ICONERROR);
else
{
sharedBuffer = (LPTSTR) MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS,0,0,0);
}
hFileMapping =
2.exe
OpenFileMapping(FILE_MAP_READ,FALSE,TEXT("katarina"));
if(hFileMapping == NULL)
MessageBox(hDlg,TEXT("Невозможно создать проекцию файла..."),TEXT("Error"),MB_ICONERROR);
else
{
sharedBuffer = (LPTSTR) MapViewOfFile(hFileMapping, FILE_MAP_READ,0,0,0);
DWORD dwError = GetLastError();
}
Обработка текстового и графического файлов двумя процессами
При обработке текстовых и графических файлов небольшого размера можно спроецировать весь файл в память. Затем произвести его обработку. По завершении обработки файла необходимо прекратить отображение на адресное пространство представления объекта «проекция файла» и закрыть описатель всех объектов ядра.
57
Текстовый файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//Открытие объекта ядра «проекция файла»
hTxtMappingFile = OpenFileMappingA(FILE_MAP_READ,FALSE,"kate");
if(hTxtMappingFile != NULL)
{
//Проецирование данных файла на адресное пространство процесса
hTxtMapFileStartAddr = MapViewOfFile(hTxtMappingFile, FILE_MAP_READ,0,0,0);
//Вывод данных из текстового файла в эдит
SetDlgItemTextA(hDlg, IDC_EDIT_TEXT,(char*)hTxtMapFileStartAddr);
//Отключение файла данных от адресного пространства процесса
UnmapViewOfFile(hTxtMapFileStartAddr);
//Закрытие объекта «проекция файла»
CloseHandle(hTxtMappingFile);
Графический файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//Открытие объекта ядра «файл»
hBmpFile = CreateFileA("LOVE.bmp",GENERIC_READ,FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
GetClientRect(GetDlgItem(hDlg,IDC_BMPFRAME),&rect);
//Создание объекта ядра «проекция файла»
hBmpMappingFile = CreateFileMappingA(
hBmpFile, //описатель файла
NULL, //аттрибуты защиты объекта ядра
PAGE_READONLY, //атрибут защиты, присваиваемый
// страницам физической памяти
0,0, //максимальный размер файла в
// байтах (0 -- размер меньше
4Гб)
"BmpFile"); //имя объекта ядра
//Проецирование данных файла на адресное пространство процесса
hBmpMapFileAddr = MapViewOfFile(
hBmpMappingFile, // описатель объекта «проекция файла»
FILE_MAP_READ, // вид доступа к данным
0,0, // смещение в файле до байта файла данных,
//который нужно считать в представлении первым
0); // сколько байтов файла данных должно быть
//спроецировано на адресное пространство
//(0 -- от смещения и до конца файла)
BITMAPFILEHEADER *bFileHeader=
(BITMAPFILEHEADER*)hBmpMapFileAddr;
BITMAPINFO *bInfo=(BITMAPINFO*)((char*)hBmpMapFileAddr+14);
hdc=GetDC(GetDlgItem(hDlg,IDC_BMPFRAME));
hBmpFile=CreateDIBitmap(hdc,&(bInfo->bmiHeader),
CBM_INIT,(char*)hBmpMapFileAddr+bFileHeader->bfOffBits,
bInfo,DIB_PAL_COLORS);
hMemDC=CreateCompatibleDC(hdc);
SelectObject(hMemDC,hBmpFile);
StretchBlt(hdc,0,0,rect.right,rect.bottom,hMemDC,
0,0,bInfo->bmiHeader.biWidth,bInfo->bmiHeader.biHeight,
SRCCOPY);
ReleaseDC(GetDlgItem(hDlg,IDC_BMPFRAME),hdc);
DeleteDC(hMemDC);
DeleteObject(hBmpFile);
return (INT_PTR)TRUE;
Работа с файлами больших размеров
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//*****Работа с большим файлом*******************
if (LOWORD(wParam) == IDC_HUGE)
{
// начальные границы представлений всегда начинаются no
// адресам, кратным гранулярности выделения памяти
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
// открываем файл данных
HANDLE hBigFile = CreateFileA("ТЕСТ.txt", GENERIC_READ,
FILE_SHARE_READ, NULL,OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,NULL);
// создаем объект проекции файла
HANDLE hHugeFileMapping = CreateFileMapping(hBigFile,
NULL,PAGE_READONLY, 0, 0, NULL);
DWORD dwFileSizeHigh;
int64 dwFileSize = GetFileSize(hBigFile,
&dwFileSizeHigh);
dwFileSize += ((( int64) dwFileSizeHigh) << 32);
// доступ к описателю объекта файл нам больше не нужен
CloseHandle(hBigFile);
int64 dwFileOffset = 0;
DWORD dwNumOfOs = 0;
char symbol[100] = "";
DWORD dwPrBarRange =
dwFileSize/sinf.dwAllocationGranularity;
while (dwFileSize > 0)
{
// определяем, сколько байтов надо спроецировать
DWORD dwBytesInBlock = sinf.dwAllocationGranularity;
if (dwFileSize < sinf.dwAllocationGranularity)
dwBytesInBlock = (DWORD)dwFileSize;
//Проецирование данных файла на адресное
//пространство процесса
PBYTE hHugeMapFileStartAddr = (PBYTE)
MapViewOfFile(hHugeFileMapping,FILE_MAP_READ,
(DWORD) (dwFileOffset >> 32), // начальный байт
(DWORD) (dwFileOffset & 0xFFFFFFFF), // в файле
dwBytesInBlock); // число проецируемых байтов
SetDlgItemTextA(hDlg, IDC_EDIT_HUGEFILE, (char*)
hHugeMapFileStartAddr);
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS),
(UINT)PBM_STEPIT, 0, 0);
// прекращаем проецирование представления,
// чтобы в адресном пространстве
// не образовалось несколько представлений одного файла
UnmapViewOfFile(hHugeMapFileStartAddr);
// переходим к следующей группе байтов в файле
dwFileOffset += dwBytesInBlock;
dwFileSize -= dwBytesInBlock;
}
CloseHandle(hHugeFileMapping);
return (INT_PTR)TRUE;
}
Пример взаимодействия процессов через Page файл.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
case WM_INITDIALOG:
1.exe
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL, PAGE_READWRITE, 0, 1000, TEXT("katarina"));
if(hFileMapping == NULL)
MessageBox(hDlg,TEXT("Невозможно создать проекцию файла в
Page-файле..."),TEXT("Error"),MB_ICONERROR);
else
{
sharedBuffer = (LPTSTR) MapViewOfFile(hFileMapping,
FILE_MAP_ALL_ACCESS,0,0,0);
}
hFileMapping =
2.exe
OpenFileMapping(FILE_MAP_READ,FALSE,TEXT("katarina"));
if(hFileMapping == NULL)
MessageBox(hDlg,TEXT("Невозможно создать проекцию
файла..."),TEXT("Error"),MB_ICONERROR);
else
{
sharedBuffer = (LPTSTR) MapViewOfFile(hFileMapping,
FILE_MAP_READ,0,0,0);
DWORD dwError = GetLastError();
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2021, 20:37
Ответы с готовыми решениями:

MappingFile передача информацию между процессами
Не могу осуществить реализацию, где в одном процессе создаем mapping и записываем в него массив, а во втором процессе открываем наш...

Передача информации между процессами через MappingFile
Задача такая, реализовать программу копирующую файл, где в одном процессе происходит чтение, а во втором запись, для передачи данных между...

Передача строки символов между процессами с использованием именованных каналов
Нашел пример по теме, но как нужно запускать эти части и произвести передачу данных от одного процесса к трем другим? Серверная часть:...

1
15.09.2021, 19:11

Не по теме:

Используйте тег кода для начала.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2021, 19:11
Помогаю со студенческими работами здесь

Управление процессами
Добрый день всем. Осталась сдать последнюю работу по процессам. Скажу честно, по процессам я не особо шарю. Может быть кто-то...

Управление процессами и потоками
Необходимо разработать программу, демонстрирующую возможности управления процессами и потоками: создание и завершение, получение сведений о...

Построение экранного интерфейса. Управление процессами
Создать главное окно с областью заголовка, рамкой , элементами управления (кнопки свертования - развертования , линейка с вертикальной...

Обмен данными между процессами
Добрый день. У меня есть программа отправителя и программа получателя. Я не совсем понимаю, как FindWindow() должно искать моё окно. У меня...

Обмен данными между процессами в Windows
Обмен данными между процессами в Windows с помощью отображения файлов в память. Как делается?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru