salvar informações dentro de um executavel.

Delphi

28/07/2004

- caros colegas, estou montando um projeto que nao utiliza banco de dados.
- bom pra começar, no formulario principal, tenho um ListBox, onde poderei incluir dados, mas gostaria que quando incluisse esses dados no meu ListBox e clicasse no botao ´SALVAR´, o programa entendesse e salvasse essas informações dentro do executável, tipo o programa keySpy faz, para quem conhece ele...

Abraços!!


Mahdak

Mahdak

Curtidas 0

Respostas

Weber

Weber

28/07/2004

Não é possivel salvar no executavel, o que você pode fazer é salvar em um arquivo texto ou no próprio registro do windows.


GOSTEI 0
Rogerio_amorim

Rogerio_amorim

28/07/2004

caro colega japa, esse negócio de salvar em executável não existe !








Rogerio Amorim


GOSTEI 0
Otto

Otto

28/07/2004

:idea: [color=blue:9943970faa][url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=16976]Saiba como obter resposta rápida..[/url][/color:9943970faa]
:idea: [color=blue:9943970faa]Leia sempre [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689]Regras de Conduta.[/url][/color:9943970faa]
:idea: [color=blue:9943970faa]Use sempre o Link [url=http://delphiforum.icft.com.br/forum/search.php][img:9943970faa]http://delphiforum.icft.com.br/forum/templates/subSilver/images/icon_mini_search.gif[/img:9943970faa] Pesquisar[/url] no topo da Página.[/color:9943970faa]

aproveitando a dica do nosso amigo weber, segue uma unit que trabalha com um listbox que grava os itens em um arquivo txt..


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Arq : TextFile;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  AssignFile(Arq,´Arq.txt´);
  Append(Arq);
  WriteLN(Arq,edit1.text);
  CloseFile(Arq);
  edit1.Clear;
  Edit1.SetFocus;
// grava no arquivo txt o texto que ta no edit
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Nome : String;
begin
  ListBox1.Clear;
  AssignFile(Arq,´Arq.txt´);
  Reset(Arq); // abre o arquivo
  While Not Eof(Arq) Do
    Begin
      ReadLN(Arq, Nome);
      ListBox1.Items.Add(Nome);
    End;
  CloseFile(Arq);
// botão que carrega os dados da lista
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  If not(FileExists(Application.GetNamePath+´Arq.txt´)) then // se o arquivos nao exitir
    begin
      AssignFile(Arq, Application.GetNamePath+´Arq.txt´);
      Rewrite(Arq);   // re-crie o arquivo.
    end;
end;

end.



GOSTEI 0
Vinicius2k

Vinicius2k

28/07/2004

caro colega japa, esse negócio de salvar em executável não existe !

Não é possivel salvar no executavel...

É obvio que existem formas de se salvar resources (Bitmap, Icon, RCData - Texto) em executáveis e DLLs... a única restrição é que o arquivo não pode estar em uso, então um executável não consegue gravar em si próprio...

Isso pode ser feito através da API do Windows com as funções BeginUpdateResource, UpdateResource e EndUpdateResouce... O único problema destas funções é que não funcionam corretamente em Win9x, então o melhor é usar as funções ´clones´ da madRes (www.madshi.net) que funcionam em todas as plataformas Windows...

A questão não é se é possível ou não, mas se o colega deve fazer isso, pois além de bastante trabalhoso é lento comparando com a leitura de um arquivo texto... então sugiro que use a forma orientada pelo oTTo...

T+


GOSTEI 0
Rômulo Barros

Rômulo Barros

28/07/2004

É obvio que existem formas de se salvar resources (Bitmap, Icon, RCData - Texto) em executáveis e DLLs... a única restrição é que o arquivo não pode estar em uso, então um executável não consegue gravar em si próprio...


1 - Eu posso ´infectar´ executáveis(word,excel..)?
2 - Se eu souber dos métodos que o executável possui, eu posso chamar um desses métodos através de uma string? (Como já foi discutido aqui no fórum?)

:?: :?: :?: :?: :?: :?: :?:


GOSTEI 0
Vinicius2k

Vinicius2k

28/07/2004

U.I,
1 - Creio que sim, mas não utilizando as próprias funções da API que estão limitadas à resources... seria um comportamento parecido com o de um vírus? se for isso, eu não sei e creio que já envolveria edição direta do código ASM do PE...
2 - Isto eu não sei.

T+


GOSTEI 0
Mahdak

Mahdak

28/07/2004

[quote:0e63a8b194=´rogerio_amorim´]caro colega japa, esse negócio de salvar em executável não existe !

Não é possivel salvar no executavel...

É obvio que existem formas de se salvar resources (Bitmap, Icon, RCData - Texto) em executáveis e DLLs... a única restrição é que o arquivo não pode estar em uso, então um executável não consegue gravar em si próprio...

Isso pode ser feito através da API do Windows com as funções BeginUpdateResource, UpdateResource e EndUpdateResouce... O único problema destas funções é que não funcionam corretamente em Win9x, então o melhor é usar as funções ´clones´ da madRes (www.madshi.net) que funcionam em todas as plataformas Windows...

A questão não é se é possível ou não, mas se o colega deve fazer isso, pois além de bastante trabalhoso é lento comparando com a leitura de um arquivo texto... então sugiro que use a forma orientada pelo oTTo...

T+[/quote:0e63a8b194]
--------------------------------
OK, mas vc poderia me dar um exemplo de como usar essas funções ´clones´ da MadRes, pois minha intenção relamente é deixar que executavel sirva como seu proprio banco de dados...
--------------------------------
abraços!
Japa.


GOSTEI 0
Vinicius2k

Vinicius2k

28/07/2004

Japa,

Primeiramente, baixe e instale o pacote MadCollection ( www.madshi.net )... exemplifico abaixo o uso das funções lendo e gravando em uma DLL (mesmo procedimento para .EXE)... mas, honestamente, não sei se vc vai conseguir o fazer o que pretende, pois um exe não conseguirá gravar nele próprio e vc apenas grava e le strings como num arquivo .ini, não tendo nenhum recurso adicional como num banco de dados...

uses
  madRes;

procedure LerRecurso;
var ResData: HGLOBAL;
    ResInfo: HRSRC;
    Recurso: String;
    hDLLRecurso: THandle;
begin
  hDLLRecurso:= LoadLibrary(´NOME_DA_DLL.DLL´);
  try
    ResInfo:= FindResource(hDLLRecurso, ´NOME_DO_RECURSO´, RT_RCDATA);
    if ResInfo <> 0 then
      begin
        ResData:= LoadResource(hDLLRecurso, ResInfo);
        if ResData <> 0 then
          try
            Recurso:= PChar(LockResource(ResData));
            UnlockResource(ResData);
          finally
            FreeResource(ResData);
          end;
      end;
  finally
    FreeLibrary(hDLLRecurso);
  end;
  // neste ponto a string presente na DLL está armazenada
  // na variável "Recurso"
end;


procedure GravarRecurso;
var hDLLRecurso: DWord;
    Recurso: String;
begin
  Recurso:= ´Gravei este texto na DLL´;
  hDLLRecurso:= BeginUpdateResourceW(´NOME_DA_DLL.DLL´, False);
  if hDLLRecurso <> 0 then
    try
      UpdateResourceW(hDLLRecurso, PWideChar(RT_RCDATA), ´NOME_DO_RECURSO´, 0, Pointer(Recurso), Length(Recurso));
    finally
      EndUpdateResourceW(hDLLRecurso, False);
    end;
  // neste ponto o valor atribuido à variável Recurso foi gravado na DLL.
end;


T+


GOSTEI 0
Beppe

Beppe

28/07/2004

[quote:8365403f8e=´Undeclared Identifier´]2 - Se eu souber dos métodos que o executável possui, eu posso chamar um desses métodos através de uma string? (Como já foi discutido aqui no fórum?)[/quote:8365403f8e]
Da mesma forma como uma DLL, desde que vc exporte as funções...mas isto não é uma prática comum, mas perfeitamente possível, entretanto, o Windows não faz distinção.


GOSTEI 0
Rômulo Barros

Rômulo Barros

28/07/2004

[quote:b9405261a5=´Undeclared Identifier´]2 - Se eu souber dos métodos que o executável possui, eu posso chamar um desses métodos através de uma string? (Como já foi discutido aqui no fórum?)

Da mesma forma como uma DLL, desde que vc exporte as funções...mas isto não é uma prática comum, mas perfeitamente possível, entretanto, o Windows não faz distinção.[/quote:b9405261a5]

Beleza. Valew a todos !!!!

É obvio que existem formas de se salvar resources (Bitmap, Icon, RCData - Texto) em executáveis e DLLs... a única restrição é que o arquivo não pode estar em uso, então um executável não consegue gravar em si próprio...

mahdak, no seu caso, acho q vc poder salvar os dados em um arquivo temporário (.txt ou .ini) e, após o encerramento do seu executável, vc poderá invocar outro executável que irá ler o arquivo temporário e salvar os dados no executável anterior, uma vez q este não irá mais estar ativado.


GOSTEI 0
POSTAR