Использование файлов, проецируемых на память
При работе с 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; просмотров: 1061;