Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-1102243521
_Dragon
2004-12-05 13:45
2005.01.02
Не создается "убывающий" индекс во время работы программы


1-1103478929
Паша555
2004-12-19 20:55
2005.01.02
TAdvSringGrid & Excel


9-1093532389
miek
2004-08-26 18:59
2005.01.02
гляньте на новую техно-демку


6-1097940533
Kross
2004-10-16 19:28
2005.01.02
Оперделение доступных ресурсво по названию компьютера


1-1103129408
tazik
2004-12-15 19:50
2005.01.02
Введение своего языка в программу