Чтение онлайн

на главную - закладки

Жанры

Шрифт:
...

function MapViewOfFile(hFileMappingObject: THandle;

dwDesiredAccess: DWORD;

dwFileOffsetHigh, dwFileOffsetLow,

dwNumberOfBytesToMap: DWORD ): Pointer;

Функция имеет следующие параметры.

• hFileMappingOb j ect – описатель созданного объекта файлового отображения.

• dwDesiredAccess – параметр доступа к полученным данным, в случае чтения и записи принимает значение FILE_MAP_WRITE.

• dwFileOf f setHigh, dwFileOf fsetLow – 64-битное смещение от начала файла.

• dwNumberOf BytesToMap – указывает, сколько байт будет отображено. Если этот аргумент имеет значение 0, то на область памяти будет отображен весь файл.

В результате успешного выполнения функции MapViewOfFile будет получен указатель (тип Pointer) на начальный адрес данных объекта. Указатель будет использоваться в дальнейшем для записи или чтения файла.

Следующей функцией, противоположной по производимым действиям функции MapViewOfFile, является UnMapViewOf File. Она отключает проецируемый файл от текущего процесса:

...

function UnMapViewOfFile(lpBaseAddress: Pointer): Boolean;

Функция принимает указатель, возвращаемый MapViewOfFile, и использует его для отмены проекции файла на адресное пространство процесса. В случае успешной выгрузки функция возвращает True, в противном случае – False.

И последняя функция, которую необходимо рассмотреть, – это CloseHandle. Она используется для закрытия дескриптора (многих системных объектов, а не только проекции файла).

...

function CloseHandle(hFileMapObj: THandle):Boolean;

Как видно из синтаксиса функции, она принимает описатель объекта файлового отображения, полученный в результате выполнения функции CreateFileMapping и освобождает его. Для правильного завершения работы с объектом файлового отображения сначала следует применить функцию UnMapViewOf File, а затем CloseHandle.

Сама проекция файла будет удалена только после того, как будут закрыты все дескрипторы во всех использующих эту проекцию процессах.

Для демонстрации работы проецируемых в память файлов создадим приложение, которое будет записывать в такой файл строку и спустя некоторое время считывать ее оттуда. Для этого нам понадобится стандартный TextBox, кнопка, метка и таймер. Программа будет работать следующим образом: строка, записанная в поле редактора, после нажатия кнопки помещается в проецируемый файл. Далее, спустя некоторое время (задается таймером), содержимое файла считывается и задается в качестве заголовка метки (рис. 8.2).

Рис. 8.2. Вид приложения, использующего проецируемый файл

В секцию описания переменных программы помещаем следующие объявления:

...

var

FormMappingFile: TFormMappingFile;

//Глобальные переменные

//Описатель объекта проецируемого файла

hFileMapObj:THandle;

//Указатель на начальный адрес данных

lpBaseAddress:PChar;

Далее рассмотрим, какие действия выполняются при загрузке формы. Создание проецируемого файла и его отображение в адресное пространство процесса выполняется в момент создания формы (листинг 8.7).

...

Листинг 8.7.

Создание формы приложения

procedure TMappingFile.FormCreate(Sender: TObject);

begin

//Создаем проецируемый файл с именем FileMemory

//и передаем полученный в результате описатель

//в глобальную переменную hFileMapObj

hFileMapObj := CreateFileMapping(MAXDWORD,Nil,PAGE_READWRITE,

0,4,’FileMemory’);

If (hFileMapObj = 0) Then

ShowMessage(\'Не могу создать проецируемый файл!\')

Else

//Подключаем файл к адресному пространству

//и получаем начальный адрес данных

lpBaseAddress := MapViewOfFile(hFileMapObj,FILE_MAP_WRITE,

0,0,0);

If lpBaseAddress = Nil Then

ShowMessage(\'Не могу подключить проецируемый файл!\');

end;

После инициализации файла его можно использовать. Приведем листинг обработчика, копирующего данные в проецируемый файл (листинг 8.8).

...

Листинг 8.8. Копирование данных в проецируемый файл

procedure TMappingFile.bnOKClick(Sender: TObject);

begin

//Считываем данные в проецируемый файл

StrPCopy(lpBaseAddress,edVariable.Text);

end;

После того как будет нажата кнопка, данные помещаются в проецируемый файл. По истечении некоторого времени, заданного таймером, строка устанавливается в качестве текста метки (листинг 8.9).

...

Листинг 8.9.

Считывание данных из проекции файла

procedure TMappingFile.TimerMFTimer(Sender: TObject);

begin

lbVariable.Caption := PChar(lpBaseAddress);

end;

В момент завершения приложения необходимо отключить проецируемый файл от адресного пространства процесса и закрыть объект файла. Эти действия можно выполнять в момент уничтожения формы (листинг 8.10).

...

Листинг 8.10.

Уничтожение формы приложения

procedure TMappingFile.FormClose(Sender: TObject; var Action:

TCloseAction);

begin

//Отключим файл от адресного пространства

UnMapViewOfFile(lpBaseAddress);

//Освобождаем объект файла

CloseHandle(hFileMapObj);

//Закрываем форму

Action := caFree;

end;

Здесь рассмотрен простой пример работы с проекцией файла в рамках одного приложения. Более же интересный и реальный пример вы увидите в разд. 10.2 при рассмотрении программы «Оконный шпион»: там проекция файла в память используется для передачи данных из функции DLL, работающей в памяти другого процесса.

Поделиться:
Популярные книги

Бастард Императора. Том 6

Орлов Андрей Юрьевич
6. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 6

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 1 и Том 2

Требую развода! Что значит- вы отказываетесь?

Мамлеева Наталья
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Требую развода! Что значит- вы отказываетесь?

Инженер Петра Великого 3

Гросов Виктор
3. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого 3

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Газлайтер. Том 22

Володин Григорий Григорьевич
22. История Телепата
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Газлайтер. Том 22

Родословная. Том 2

Ткачев Андрей Юрьевич
2. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 2

Товарищ "Чума" 4

lanpirot
4. Товарищ "Чума"
Фантастика:
городское фэнтези
альтернативная история
5.00
рейтинг книги
Товарищ Чума 4

Барон

Первухин Андрей Евгеньевич
5. Ученик
Фантастика:
фэнтези
5.60
рейтинг книги
Барон

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Матабар. II

Клеванский Кирилл Сергеевич
2. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар. II

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4