Использование файлов, проецируемых на память


При работе с Win32 существует возможность читать и записывать данные в файл так, как будто это блок памяти. Этот прием часто рекомендуется использовать также при разделении памяти между двумя и более процессами.

Рассмотрим простейший подход к вводу-выводу с использованием файлов, проецируемых в память (memory mapped files).

Сначала создается обычный файл hFile с использованием функции CreateFile, затем вызывается функция:

HANDLE hMap=CreateFileMapping(hFile, NULL, dwProtect, 0, 0, szName);

· Параметр dwProtect принимает одно из следующих значений - PAGE_READONLY, PAGEWRITECOPY, PAGE_READWRITE - и должен быть совместим с режимом разделения файла между процессами. Последний параметр функции - необязательное имя, обычно используемое для разделения данных между процессами. В этом случае функция OpenFileMapping открывает тот же файл с указанным именем. Обе функции возвращают значение типа HANDLE.

Если необходимо осуществить доступ к части файла, то вызывается функция MapViewOfFile:

LPVOID p=MapViewOfFile(hMap,dwAccess,dwHigh,dwLow,dwNumber);

· Весь файл или его часть могут быть спроецированы в память, начиная с заданного 64-разрядного смещения, которое задается параметрами dwHigh и dwLow (если файл имеет размер меньше 4 ГБ, то очевидно, что dwHigh будет иметь нулевое значение). Параметр dwNumber задает количество байтов, которое необходимо спроецировать на память. Параметр dwAccess указывает на то, что можно с этими данными делать (считывать и записывать или только считывать), и должен соответствовать параметру dwProtect функции CreateFileMapping.

После этого можно использовать указатель, возвращаемый функцией, для доступа или модификации данных в файле. Функция FlushViewOfFile записывает на диск все измененные страницы файла, спроецированного в память. Функция UnmapViewOfFile делает недействительным указатель, возвращаемый функцией MapViewOfFile. Затем необходимо закрыть файл, используя функцию CloseHandle.

Замечание. Не излишне ли использовать дисковый файл, если необходимо лишь передать несколько байт между приложениями? В действительности нет необходимости явно открывать и использовать дисковый файл для получения отображения в памяти. Приложения могут передать специальное значение дескриптора равное 0хFFFFFFFF в функцию CreateFileMapping для получения отображения непосредственно в системный страничный файл. Это, по сути, создает блок разделяемой между приложениями памяти.

 



Дата добавления: 2017-01-26; просмотров: 1003;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.007 сек.