Первый шаг в отображении файла - это открытие файла при помощи вызова функции CreateFile. Чтобы гарантировать, что другие процессы не смогут писать в части файла, которая отображается, вам следует открыть файл с монопольным доступом. Кроме того, дескриптор файла должен оставаться открытым до тех пор, пока у процесса не исчезнет нужда в объекте "проецируемый файл". Легкий способ получить монопольный доступ состоит в том, чтобы установить нуль в параметре dwShareMode функции CreateFile. Дескриптор, возвращенный CreateFile используется функцией CreateFileMapping, чтобы создать объект "проецируемый файл".
Функция CreateFileMapping возвращает дескриптор объекта "проецируемый файл". Этот дескриптор должен использоваться при создании представления файла так, чтобы Вы могли получить доступ к совместно используемой памяти. Когда Вы вызываете CreateFileMapping, то задайте имя объекта, число байтов, которые отобразятся из файла и разрешение чтения - записи в отображаемой памяти. Первый процесс, который вызывает функцию CreateFileMapping, создает объект "проецируемый файл". Процессы, вызывающие CreateFileMapping для существующего объекта получают его дескриптор. Вы можете убедиться, успешно или нет завершился вызов CreateFileMapping, который создавал или открывал объект "проецируемый файл", при помощи вызова функция GetLastError. GetLastError возвращает значение NO_ERROR создающему процессу и ERROR_ALREADY_EXISTS последующим процессам.
Функция CreateFileMapping завершается ошибкой, если флажки доступа находятся в противоречии с установленными тогда, когда функция CreateFile открывала файл. Например, чтобы читать и записывать в файл:
Процедура создания объекта "проецируемый файл" не закрепляет физическую память, она только резервирует её.
Размер проецируемого в память файла
Размер объекта "проецируемый файл" не зависит от размера отображаемого файла. Однако, если объект "проецируемый файл" является большим чем файл, система увеличивает файл до возвращения значения функцией CreateFileMapping. Если объект "проецируемый файл" является меньшим чем файл, система проецирует только определенное число байтов из файла.
Параметры dwMaximumSizeHigh и dwMaximumSizeLow функции CreateFileMapping дают возможность устанавливать число байтов, которые будут отображаться из файла:
Если Вы не хотите изменять размер файла (например, когда отображаете файл только для чтения) вызовите функцию CreateFileMapping и установите оба её параметра dwMaximumSizeHigh и dwMaximumSizeLow в нуль. Выполнение этого приема создает объект "проецируемый файл" точно такого же размера, как и файл. В противном случае, Вы должны вычислить или приблизительно подсчитать размер законченного файла, потому что объекты "проецируемый файл" являются статическими по размеру; после создания их размер не может увеличиться или уменьшиться. Попытка проецировать файл с нулевой длиной этим способом завершается ошибкой с кодом ошибки ERROR_FILE_INVALID. Программы должны обнаруживать файлы с нулевой длиной и отвергать такие файлы:
Размер объекта "проецируемый файл" выбирается при помощи контроля, как далеко в файле с отображением в памяти Вы можете "видеть". Если Вы создаете 500 килобайтный объект "проецируемый файл" , Вы имеете доступ только к первым 500 КБ файла, независимо от размера его файла. Так как, чтобы создать больший объект "проецируемый файл", не требуется от Вас системных ресурсов, создайте его по размерам одинаковым с файлом (установив нули в обоих параметрах dwMaximumSizeHigh и dwMaximumSizeLow функции CreateFileMapping), даже если Вы не предполагаете просматривать весь файл. В затраты системных ресурсов входит создание представлений и доступа к ним.
Если Вы хотите просмотреть часть файла, которая начинается не в начале файла, Вы должны создать объект "проецируемый файл". Этот объект - размер части файла, который Вы хотите просмотреть плюс смещение в файле.