Запуск дочерних процессов. Простейшие способы взаимодействия (обмена данными), страница 6

LPCTSTR     lpName);    // имя объекта, посредством которого отображение может быть доступно всем работающим процессам. Это строка, заканчивающаяся 0 и не содержащая символа «\», регистр не влияет. Если отображение будет использоваться только одним процессом, то NULL – “MyFileMapping”

LPVOID MapViewOfFile(//или MapViewOfFileEx – которая пытается «привязать» проецируемые данные к указанному Вами адресу. Это может быть адрес Вашего массива

HANDLE hFileMappingObject,    //дескриптор объекта «проекция файла», полученный предыдущим CreateFileMapping() или OpenFileMapping()

DWORD dwDesiredAccess,  //вид доступа к данным (должен соответствовать правам доступа объекта FileMapping) – придется опять указывать каким образом мы хотим обращаться к файловым данным: FILE_MAP_WRITE – можно и считывать, и записывать (должны были вызвать CreateFileMapping c PAGE_READWRITE) FILE_MAP_READ – можно только считывать, (можно было вызвать CreateFileMapping c любым :PAGE_READWRITE, PAGE_READONLY, PAGE_WRITECOPY) FILE_MAP_ALL_ACCESS== то же, чтоFILE_MAP_WRITE (и чтение, и запись) FILE_MAP_COPY – если отображение создано с PAGE_WRITECOPY, Вы получаете доступ к файлу следующим образом: если Вы туда пишите, то изменения не затрагивают оригинальный файл, а касаются только Вашей копии содержимого файла.

DWORD dwFileOffsetHigh, //необязательно проецировать на адресное пространство весь файл сразу – можно только требуемую часть, которая в таком случае называется представлением – view.=> смещение первого байта view относительно начала. Замечание: смещение в файле должно быть четным числом и кратным гранулярности выделения ресурсов в данной системе – в Win32 – 64Кб. Для отображения от начала файла - 0

DWORD dwFileOffsetLow,      // если оба параметра=0, то от начала файла

SIZE_T dwNumberOfBytesToMap ); //количество байт (размер представления не может превышать 4Гб). Если параметр=0, система попытается спроецировать представление с указанного смещения и до конца файла.

BOOL UnmapViewOfFile(

LPCVOID lpBaseAddress ); //тот базовый адрес, который был получен в результате MapViewOfFile().Если Вы не сделаете этого, регион не освободится до завершения Вашего процесса.

);

4.1. Совместное использование одной и той же физической памяти несколькими процессами

Создайте в родительском и дочернем процессах отображение (для использования его двумя процессами можно использовать именование объекта).

Подсказка: для того, чтобы два процесса обращались к одной и той же памяти, объект ядра FileMapping, созданный в родительском процессе, должен существовать пока им пользуется другой процесс (иначе два процесса будут пользоваться совершенно разными объектами, просто имя у этих объектов будет одним и тем же).

В каждом процессе предусмотрите возможность читать/писать в общую память. Подумайте, каким образом один процесс может узнавать о модификации общей памяти (о том, что ему нужно заново считать содержимое из общей памяти)?

4.2. Совместный доступ к одному файлу

Задание:

1)  создайте текстовый файл (в нем может быть несколько строк)

2)  в родительском процессе по какому-нибудь событию (кнопка) отобразите содержимое файла на память (для проверки можно вывести это содержимое в элемент типа edit, при этом у edit-а должны быть установлены стили: Want Return и Multiline)

3)  в дочернем процессе отобразите содержимое того же файла на память (подумайте – нужно ли для этого в дочернем процессе открывать файл???)

4)  для проверки можно вывести это содержимое в элемент типа edit

5)  модифицируйте строку в общей памяти.

6)  проверьте – изменилось ли содержимое файла???