![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проецируемые в память файлы [D7, WinXP]
The Scorpion © (2004-11-18 20:54:00)При замене строчки в файле изменения происходят нормально ,но
при добавление строки ее видит только моя программа.Подскажите пожалуйста в чем я ошибся.
var
Form1: TForm1;
DwOldFree,DwNewFree,DWOLdComm,
DwNewComm,DwOldRese,DwNewRese:dword;
ind:byte;
data:pchar;
hFile,hMapping:thandle;
mbi : TMemoryBasicInformation;
procedure TForm1.Button3Click(Sender: TObject);
begin
data:=nil;
if opendialog1.Execute then
begin
hFile:=CreateFile ( Pchar (opendialog1.FileName),Generic_Read or GENERIC_WRITE,
0,nil,OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH,0 );
hMapping := CreateFileMapping (hFile, nil, PAGE_READWRITE ,
{SEC_RESERVE or SEC_COMMIT}0 ,0,nil );
CloseHandle (Hfile);
Data := MapViewOfFile (hMapping,FILE_MAP_ALL_ACCESS ,0,0,0);
memo1.SetTextBuf(data);
end;
end;
procedure TForm1.N3Click(Sender: TObject);
var
h:thandle;
begin
if (data=nil) then
if savedialog1.Execute then
begin
hFile:=CreateFile ( Pchar (savedialog1.FileName),Generic_Read or GENERIC_WRITE,
File_Share_Read,nil,OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN,0 );
hMapping := CreateFileMapping (hFile, nil, PAGE_READWRITE ,
{SEC_RESERVE or SEC_COMMIT}0 ,0,nil );
Data := MapViewOfFile (hMapping,FILE_MAP_ALL_ACCESS ,0,0,0);
memo1.GetTextBuf(data,memo1.GetTextLen+1) ;
FlushViewOfFile(data,memo1.GetTextLen+1);
data:=nil;
end;
memo1.GetTextBuf(data,memo1.GetTextLen+1) ;
FlushViewOfFile(data,memo1.GetTextLen+1);
UnmapViewOfFile (Data);
data:=nil;
end;
Игорь Шевченко (2004-11-18 23:29:00) [1]
> можно сделать так чтобы он увеличился?
Нет. Под FileMapping место нужно отводить заранее.
The Scorpion (2004-11-18 23:26:00) [2]"Кто сказал, что в этом случае система размер файла будет увеличивать?"
А можно сделать так чтобы он увеличился?
Ihor Osov'yak (2004-11-18 21:55:00) [3]хм.. странно, что программа вообще не вылетает.
Вот здесь - в первом memo1.GetTextBuf(data,memo1.GetTextLen+1) ; - для случая, если размер файла менше, чем размер memo1.GetTextLen+1... Причина, возможно, в том, что память под мапирование распределяется страницами..
Увеличте текст в мемо более чем на 4096 символов - думаю, вылет будет гарантировано..
А не сохраняется потому, что Вы пытаетесь оперировать с памятью за пределами мапированой области.. Кто сказал, что в этом случае система размер файла будет увеличивать? Это что-то сродни попытки залить 4 литра в трехлитровую бутыль..
Мастер (2004-11-18 21:44:00) [4]А как второй процесс открывает проекцию?