Добавить данные в EXE файл и получить их

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.

 

}

Добавить комментарий