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().Если Вы не сделаете этого, регион не освободится до завершения Вашего процесса.
);
Создайте в родительском и дочернем процессах отображение (для использования его двумя процессами можно использовать именование объекта).
Подсказка: для того, чтобы два процесса обращались к одной и той же памяти, объект ядра FileMapping, созданный в родительском процессе, должен существовать пока им пользуется другой процесс (иначе два процесса будут пользоваться совершенно разными объектами, просто имя у этих объектов будет одним и тем же).
В каждом процессе предусмотрите возможность читать/писать в общую память. Подумайте, каким образом один процесс может узнавать о модификации общей памяти (о том, что ему нужно заново считать содержимое из общей памяти)?
Задание:
1) создайте текстовый файл (в нем может быть несколько строк)
2) в родительском процессе по какому-нибудь событию (кнопка) отобразите содержимое файла на память (для проверки можно вывести это содержимое в элемент типа edit, при этом у edit-а должны быть установлены стили: Want Return и Multiline)
3) в дочернем процессе отобразите содержимое того же файла на память (подумайте – нужно ли для этого в дочернем процессе открывать файл???)
4) для проверки можно вывести это содержимое в элемент типа edit
5) модифицируйте строку в общей памяти.
6) проверьте – изменилось ли содержимое файла???
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.