procedure TForm1.Button1Click(Sender: TObject);
var hFile1: THandle;
hMap : THandle;
buff: Pointer;
begin
hFile1:=CreateFile('D:\123123123.txt',
GENERIC_ALL,
FILE_ATTRIBUTE_READONLY,
NIL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
hMap:=CreateFileMapping(hFile1,
Nil,
PAGE_READONLY,
0,
0,
nil);
buff := MapViewOfFile(hMap,
FILE_MAP_READ,
0,
0,
[COLOR="Red"]256[/COLOR]);
if buff = nil then exit;
Memo1.text:=PChar(buff);
UnmapViewOfFile(buff);
CloseHandle(hMap);
CloseHandle(hFile1);
end;
File Mapping
Код:
Вот если выделенное заменить на 0, то все работает, но читается весь файл. А если он больше 4 Гб? Что я делаю не так?
Только что заметил особенность: вес файла 4939 байт, если в качестве выделенного параметра указать число от 4097 до 4939 - выводит весь файл. Меньше - ошибка. Больше - buff = nil
Сам разобрался. Косяк был не в мапировании, а в копировании области памяти. Забыл эту область заранее выделить.
К чему FILE_ATTRIBUTE_READONLY в аргументе не для того предназначенном?
exit посреди процедуры может привести к handle-leak.
Цитата: Gambler-Sanek
А если он больше 4 Гб?
на 32х разрядных системах ему "достаточно" быть поменьше 2 Гб чтобы не промаппиться.
это кусок программы, так что на счет exit можно не переживать. Его нет. За атрибуты чтения - спасибо.