Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > FileMapping


Автор: NetDigger 5.11.2004, 09:35
Здравствуйте, уважаемые!
Вопрос в следующем: проецирую файл в память, его содержимое загоняю в Мемо (текстовый файл менее 40 кб). изменяю его в Мемо, а теперь как его вернуть взад на диск? FlushViewOfFile не работает вообще. Приведу части исходника. Как записать изменения, сделанные в Мемо обратно в текстовый файл на диске. Сделать это надо в Вин98 и в Вин2000. Кроме того, когда мэплю файл в Вин98 и вывожу его содержимое - в отображении появляется всякая хрень. В вин2000 такого нет. Заранее спасибо

var
Data: Pointer;
HFile, HMMF: THandle;
PathToFile : Pchar;

Begin

HFile := CreateFile ( Pchar (PathToFile),Generic_All, File_Share_Read
or File_Share_Write,
nil, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,0 );
If ( HFile = 0 ) then Begin
ShowMessage('Error on stage CreateFile!');
EXIT;
End;

HMMF := CreateFileMapping (hFile,nil,PAGE_READWRITE,0,0,'Leha' );

If HMMF = 0 then Begin
ShowMessage(' Error on stage CreateFileMapping' );
exit;
End;
// Data := nil;

Data := MapViewOfFile (HMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
If Data = nil then
SHowMessage('ERROR!!!');

memo1.SetTextBuf(Data);
End;



Автор: <Spawn> 5.11.2004, 12:10
Видимо, что SetTextBuf фомрирует новый блок данных, являющийся копией текста, на который указывает передаваемый указатель. Так что делай так:

[code=] Memo1.GetTextBuf(Data, Memo1.GetTextLen);
FlushViewOfFile(Data, Memo1.GetTextLen);[/CODE]

Но учти что размер спроецированного файла, если мне не изменяет память, нельзя изменить, без перепроецированияsmile) Так что если тебе нужно сохранить текст большего размера, то учитывай это, по возможности, заранее, либо заново проделывай все операции.

Автор: p0s0l 5.11.2004, 18:52
Перенесенно из раздела Delphi

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)