sábado, 17 de outubro de 2009

Gravando uma string em um .exe

{Serão usados os objetos TStream do Delphi para gravar e ler uma string qualquer em um Executável.

Neste exemplo utilizamos 2 TButtons e um componente TMemo.}

implementation

{$R *.DFM}

{ Função que faz a gravação no executável }
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);
// posiciona no final do arquivo.
aStream.Seek(0, soFromEnd);
// copia os dados para um Stream de memória.
aStream.CopyFrom(MemoryStream, 0);
// salva o “Stream-Size”
iSize := MemoryStream.Size + SizeOf(Integer);
aStream.Write(iSize, SizeOf(iSize));
finally
aStream.Free;
end;
Result := True;
end;

{ Lê a string do executável }
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);
// posiciona para leitura da String recém gravada.
aStream.Seek( - SizeOf(Integer), soFromEnd);
aStream.Read(iSize, SizeOf(iSize));
if iSize > aStream.Size then
begin
aStream.Free;
Exit;
end;
// Carrega em um Stream de memória.
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;

{ Salva a string no executável }
procedure TForm1.btnSalvaClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
Memo1.Lines.SaveToStream(aStream);
AttachToFile(‘Test.exe’, aStream);
aStream.Free;
Memo1.Clear;
end;

{ Carrega a string gravada no executável }
procedure TForm1.btnLerClick(Sender: TObject);
var
aStream: TMemoryStream;
begin
aStream := TMemoryStream.Create;
LoadFromFile(‘Test.exe’, aStream);
Memo1.Lines.LoadFromStream(aStream);
aStream.Free;
end;

end.

Nenhum comentário:

Postar um comentário