Текущий архив: 2005.01.02;
Скачать: CL | DM;
Вниз
Запись в себя Найти похожие ветки
← →
Артем Владимирович (2004-12-20 00:44) [0]Уважаемые Мастера!
Как можно программе во время исполнения записать информацию в себя и сохранить ее (для последующего обращения)?
Вообще было бы интересно узнать как сохранять большие блоки информации. Например, для того, чтобы сохранять html-файлы.
Запись в реестр и отдельные файлы не подходит, т.к. при переносе на другую машину информация будет утеряна.
Заранее благодарю всех участников дискуссии.
← →
AlterEgo of WondeRu © (2004-12-20 01:12) [1]
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
MemoryStream.Seek(0, soFromBeginning);
// seek to end of File
// ans Ende der Datei Seeken
aStream.Seek(0, soFromEnd);
// copy data from MemoryStream
// Daten vom MemoryStream kopieren
aStream.CopyFrom(MemoryStream, 0);
// save Stream-Size
// die Streamgro?e speichern
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;
function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
aStream: TFileStream;
iSize: Integer;
begin
Result := False;
if not FileExists(AFileName) then
Exit;
try
aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
// seek to position where Stream-Size is saved
// zur Position seeken wo Streamgro?e gespeichert
aStream.Seek(-SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size then
begin
aStream.Free;
Exit;
end;
// seek to position where data is saved
// zur Position seeken an der die Daten abgelegt sind
aStream.Seek(-iSize, soFromEnd);
MemoryStream.SetSize(iSize - SizeOf(Integer));
MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize));
MemoryStream.Seek(0, soFromBeginning);
finally
aStream.Free;
end;
Result := True;
end;
procedure TForm1.SaveClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile("Test.exe", aStream);
aStream.Free;
end;
procedure TForm1.LoadClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
LoadFromFile("Test.exe", aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;
{
Note:
You can"t proof whether additional data is attached or not.
To reach this, you would have to create a checksumm of the
MemoryStream and attach it.
}
delphiworld.narod.ru
← →
Артем Владимирович (2004-12-20 01:14) [2]Благодарю, AlterEgo of WondeRu. Интересное решение. Попробую.
← →
KilkennyCat © (2004-12-20 03:12) [3]гм... вроде более надежно - обращение к ресурсам в екзешнике.
← →
VMcL © (2004-12-20 06:35) [4]>>Артем Владимирович (20.12.04 00:44)
>Как можно программе во время исполнения записать информацию в себя и сохранить ее (для последующего обращения)?
Без использования "хакерских" методов - никак.
← →
Артем Владимирович (2004-12-20 08:55) [5]
> KilkennyCat © (20.12.04 03:12) [3]
> гм... вроде более надежно - обращение к ресурсам в екзешнике.
Так вот вопрос был именно, как во время исполнения сохранять информацию. Насколько я понимаю, ресурсы нельзя создавать во время исполнения. Если ошибаюсь, то подскажите как?
Еще один вопрос: а как указанным выше способом сохранять несколько блоков информации?
← →
Digitman © (2004-12-20 08:58) [6]
> Насколько я понимаю, ресурсы нельзя создавать во время исполнения.
> Если ошибаюсь, то подскажите как?
см. BeginUpdateResource + UpdateResource + EndUpdateResource
с пом. этих WinAPI-ф-ций можно и создавать новые и модифицировать/уничтожать существующие ресурсы
Страницы: 1 вся ветка
Текущий архив: 2005.01.02;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.04 c