Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»

Для освобождения региона адресного пространства, содержащего спроецированный файл необходимо вызвать следующую фунцию:

function UnmapViewOfFile(lpBaseAddress: Pointer): Boolean;

где lpBaseAddress – базовый адрес освобождаемого региона, который должен совпадать со значением, полученным после вызова функции MapViewOfFile.

4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»

Для закрытия объектов ядра «файл, проецируемый в память» и «файл» дважды вызывается функция:

function CloseHandle(hObject: THandle): Boolean;

где hObject – дескриптор объекта.

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

4.3 Примеры программ, выполняющих проецирование в память

4.3.1 Пример 1

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

VAR

hFile,hFileMap:THandle; pFile,Str:PChar; Size:Integer;

begin

Str:='Работа с файлами, проецируемыми в память'+#0;

hFile:=CreateFile('C:\file1.txt',GENERIC_READ OR GENERIC_WRITE,

FILE_SHARE_READ OR FILE_SHARE_WRITE, nil,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

If hFile=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]); exit;

end;

Size:=GetFileSize(hFile,nil)+StrBufSize(Str)+1;

hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil);

If hFileMap=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"', [GetlastError]);

CloseHandle(hFile); exit;

end;

pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);

If pFile=nil then

begin

ShowMessageFmt('Ошибка %d при проецировании в память', [GetlastError]);

CloseHandle(hFile); CloseHandle(hFileMap); exit;

end;

pFile[GetFileSize(hFile,nil)]:=#0;

//Добавление строки Str в конец файла, проецируемого в память

Strcat(pFile,Str); UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap);

end;

4.3.2 Пример 2

Данная программа перед каждым словом вставляет три восклицательных знака.

VAR

hFile,hFileMap:THandle; pFile:PChar; Size,Size1,i,j,q:Integer;

begin

hFile:=CreateFile('file1.txt',GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

If hFile=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]);

exit;

end;

Size1:=GetFileSize(hFile,nil);

// Размер файла увеличивается на 30 байт (считаем, что этого будет достаточно при вставке новых символов)

Size:=GetFileSize(hFile,nil)+30;

hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil);

If hFileMap=INVALID_HANDLE_VALUE then

begin

ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"',[GetlastError]);

CloseHandle(hFile); exit;

end;

pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0);

If pFile=nil then

begin

ShowMessageFmt('Ошибка %d при проецировании в память',[GetlastError]);

CloseHandle(hFile); CloseHandle(hFileMap); exit;

end;

For i:=Size1 to Size1+30 do pFile[i]:=' ';

//Поиск слов

i:=0;

While i<Size1 do

begin

If ((i=0) and (pFile[0]<>' ')) or((pFile[i]<>' ') and (pFile[i-1]=' ')) then

begin

For q:=1 to 3 do

begin

For j:=Size1+1 Downto i+1 do pFile[j]:=pFile[j-1]; Size1:=Size1+1;

end;

pFile[i]:='!'; pFile[i+1]:='!'; pFile[i+2]:='!'; i:=i+4;

end

else i:=i+1;

end;

UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap);

end;