Fórum salvar informações dentro de um executavel. #244764
28/07/2004
0
- 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
Curtir tópico
+ 0Posts
28/07/2004
Weber
Gostei + 0
28/07/2004
Rogerio_amorim
Rogerio Amorim
Gostei + 0
28/07/2004
Otto
: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
28/07/2004
Vinicius2k
É 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
28/07/2004
Rômulo Barros
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
28/07/2004
Vinicius2k
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
28/07/2004
Mahdak
É 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
28/07/2004
Vinicius2k
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
28/07/2004
Beppe
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
28/07/2004
Rômulo Barros
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 !!!!
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
Clique aqui para fazer login e interagir na Comunidade :)