Отображение файла в память позволяет отображать память на жестком диске в адресное пространство приложения. Это означает, что байтами в файле можно манипулировать так, как если бы они находились в оперативной памяти.
Для отображения файла в память необходимо:
– создать или открыть файл функцией CreateFile(), которая возвращает дескриптор файла;
– отобразить файл в память функцией CreateFileMapping();
– закрыть файл функцией CloseHandle();
– получить указатель на другую область памяти, в которую отображен файл функцией MapViewOfFile();
– по окончании работы с файлом закрыть все используемые переменные функциями UnmapViewOfFile() и CloseHandle()
HANDLE CreateFileMapping (
HANDLE hFile, // дескриптор отображаемого файла
LPSECURITI_ATTRIBUTES pAttr, // необязательные атрибуты безопасности
DWORD flProtect, //защита для объекта отображения
DWORD dwMaxHigh, //старшие 32 бита размера объекта
DWORD dwMaxLow, // младшие 32 бита размера объекта
LPSTR lpName); //имя объекта отображения
Первый параметр содержит дескриптор файла, который требуется отобразить в память. Этот дескриптор может быть получен функцией CreateFile().
Второй обычно равен NULL для установления набора атрибутов безопасности по умолчанию.
Третий параметр может принимать один из следующих значений:
PAGE_READONLY – передаваемая часть файла доступна только для чтения;
PAGE_READWRITE – передаваемая часть файла доступна для чтения и
записи, при этом в функции CreateFile() должны использоваться параметры: GENERIC_READ и GENERIC_WRITE.
PAGE_WRITECOPY – доступен для записи и копирования, в CreateFile()
должны использоваться:
GENERIC_READ и GENERIC_WRITE.
Если четвертый и пятый параметры равны NULL, то в них автоматически помещается значение размера отображаемого файла.
Последний шестой параметр содержит имя объекта отображения. По этому имени разные процессы могут обращаться к этому файлу, что позволяет разделять память между приложениями. Если задания имени объекта не требуется, то значение параметра NULL.
Вызов CreateFileMapping() не позволяет еще использовать отображаемые файлы. Эти функции только открывает отображаемый файл, но не позволяет получить указатель на область ”памяти” в этом файле. Для этого используется MapViewOfFile().
LPVOID MapViewOfFile(
HANDLE hFileObject, // объект возвращаемый функцией
// CreateFileMapping()
DWORD dwAccess, // режим доступа
DWORD dwOffsetHigh, // старшие 32 разряда смещения в файле
DWORD dwOffsetLow, // младшие 32 разряда смещения в файле
DWORD dwNumberBytes); // количество отображаемых байт
Первый параметр – отображает объект, значение дескриптора которого возвращается функцией CreateFileMapping().
Второй параметр устанавливает режим доступа и может принимать следующие значения:
FILE_MAP_WRITE – доступ для чтения/записи;
FILE_MAP_READ – доступ только для чтения;
FILE_MAP_COPY – создание копии при записи.
Третий и четвертый параметры являются старшими и младшими двойными словами, содержащие значение смещения внутри файла, начиная с которого нужно произвести чтение. Эти параметры используються если файл очень большой. Обычно значения их равны 0, что устанавливает чтение с начала файла.
Последний параметр – число отображаемых байт. Если нужно прочитать весь файл, то его значение равно NULL.
Пример:
LPVOID Data = MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0);
После того как указатель Data на область памяти получен, его можно использовать для доступа к содержимому файла. При этом с содержимым файла можно обращаться так, как если бы это было обычная оперативная память. Если последние байты двух отображенных в память файлов равны 0 , то эти файлы можно присоединять друг к другу, сравнивать и т.д. с помощью обычных функций работы со строками.
И Н Т Е Р Ф Е Й С ГРАФИЧЕСКИХ УСТРОЙСТВ (GDI)
Приложения Windows используют системные драйверы самого Windows для управления устройствами отображения. При этом программисту не надо самому заниматься написанием драйверов устройств, достаточно пользоваться уже существующими функциями GDI. И если приложение выполняют , например, на компьютере с лучшим видеоадаптером, чем тот, который вы использовали при написании приложения, то благодаря GDI приложение будет автоматически исполняться с новым адаптером Windows режиме с наибольшим разрешением. Поэтому если используется новый видеоадаптер, то качество картинок, отображаемых приложением, будет лучше.
Таким образом, при использовании GDI не возникают проблемы, связанные с перенесением приложений на компьютеры с другими устройствами отображения, если эти устройства поддерживает Windows.
GDI обеспечивает для программ возможность использования двухмерной графики, различных наборов шрифтов, битовых образов и т.д.