
- •1. Проецируемые в память файлы
- •2. Проецирование в память exe- и dll-файлов
- •2.1. Статические данные разделяются несколькими экземплярами exe или dll
- •2.2. Использование общего раздела в приложениях для межпроцессного взаимодействия
- •3. Использование проецируемых в память файлов
- •3.1. Создание/открытие объекта ядра «файл»
- •3.2. Создание объекта ядра – «проекция файла»
- •3.3. Проецирование файловых данных на адресное пространство процесса
- •3.4. Отключение файла данных от адресного пространства процесса
- •3.5. Закрытие объектов «проекция файла» и «файл»
- •4. Файлы, проецируемые на физическую память из страничного файла
- •5. Порядок выполнения работы
- •6. Контрольные вопросы
4. Файлы, проецируемые на физическую память из страничного файла
До сих пор мы говорили о методах, позволяющих проецировать представление файла, размещенного на диске. В то же время многие программы при выполнении создают данные, которые им нужно разделять с другими процессами. А создавать файл на диске и хранить там данные только с этой целью очень неудобно.
Прекрасно понимая это, Microsoft добавила возможность проецирования файлов непосредственно на физическую память из страничного файла, а не из специально создаваемого дискового файла. Этот способ даже проще стандартного — основанного на создании дискового файла, проецируемого в память. Во-первых, не надо вызывать CreateFile, так как создавать или открывать специальный файл не требуется, просто вызывается, как обычно, CreateFileMapping и передается INVALID_HANDLE_VALUE в параметре hFile. Тем самым указывается системе, что создавать объект «проекция файла», физическая память которого находится на диске, не надо; вместо этого следует выделить физическую память из страничного файла. Объем выделяемой памяти определяется параметрами dwMaximumSizeHigh и dwMaximumSizeLow.
Создав объект «проекция файла» и спроецировав его представление на адресное пространство своего процесса, его можно использовать так же, как и любой другой регион памяти. Если необходимо, чтобы данные стали доступны другим процессам, следует вызвать CreateFileMapping и передать в параметре pszName строку с нулевым сим волом в конце. Тогда посторонние процессы — если им понадобится сюда доступ — смогут вызвать CreateFileMapping или OpenFileMapping и передать ей то же имя.
Когда необходимость в доступе к объекту «проекция файла» отпадет, процесс должен вызвать CloseHandle. Как только все описатели объекта будут закрыты, система освободит память, переданную из страничного файла.
5. Порядок выполнения работы
Создать приложение с разделяемым разделом, который включает в себя счетчик целого типа и строку, счетчик служит для подсчета количества запущенных экземпляров приложения. Строка служит для передачи информации всем экземплярам приложения по событию. Приложения должны иметь средства отображения строки и своего порядкового номера, а также управляющие элементы для ввода данной строки и чтения данной строки по требованию.
Создать файл и спроецировать его на адресное пространство, записать в проекцию массив строк. Скопировать данный из файла с помощью проекции в новый файл (файл источник и файл приемник должны быть спроецированы на адресное пространство процесса).
В родительском процессе выполнить проецирование файла на физическую память из страничного файла. Запустить дочерний процесс, передать ему через параметр командной строки имя проекции. Осуществить передачу данных из родительского процесса в дочерний процесс через проекцию файла.
6. Контрольные вопросы
Каково назначение проецируемых в память файлов?
Как осуществляется проецирование в память EXE и DLL файлов?
Как статические данные разделяются между экземплярами EXE и DLL?
Что такое разделы в EXE и DLL файлах? Какие типы разделов бывают? Как их можно использовать для межпроцессного взаимодействия?
Как создать проецируемый в память файл?
Какие атрибуты защиты можно присвоить проекции файла?
Обязательно ли открывать файл для создания проекции файла?
Как можно использовать проекцию файла для межпроцессного взаимодействия?