Fórum mudar localização do próprio prg em tempo de execução #172650
01/08/2003
0
Alguém sabe como mudar a localização do programa pelo próprio programa em execução?? Ou como copiar para outro local e depois apagar, mas em tempo de execução???
Gilsoft
Curtir tópico
+ 0
Responder
Posts
01/08/2003
Joilson_gouveia
Gilsoft,
Isso é feito enganando o Sistema Operacional com arquivo bat.
Adapte o código abaixo:
[b:677fbdc49b]
752 - Como fazer para um executavel se Auto-Deletar
Até onde sei é impossivel fazer com que um executavel de Auto-Delete, porém podemos criar um arquivo de lote (*.bat) para que o mesmo faça o serviço.
E é o que a dica abaixo faz!
unit Unit_AutoDelecao;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TDriveType = (dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM, dtRAM);
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function GetTmpDir: string; // Get the windows temporary directory
var
pc: PChar;
begin
pc := StrAlloc(MAX_PATH + 1);
GetTempPath(MAX_PATH, pc);
Result := string(pc);
StrDispose(pc);
end;
procedure DelExe; // procedure to delete the current program
function GetTmpFileName(ext: string): string;
var
pc: PChar;
begin
pc := StrAlloc(MAX_PATH + 1);
GetTempFileName(PChar(GetTmpDir), ´EZC´, 0, pc);
Result := string(pc);
Result := ChangeFileExt(Result, ext);
StrDispose(pc);
end;
var
batchfile: TStringList;
batchname: string;
begin
if (TDRiveType(GetDriveType(PChar(´C:\´))) = dtFloppy) or (TDRiveType(GetDriveType(PChar(´C:\´))) = dtFixed) then
begin
batchname := GetTmpFileName(´.bat´);
FileSetAttr(ParamStr(0), 0);
batchfile := TStringList.Create;
with batchfile do
begin
try
Add(´:Label1´);
Add(´del ´´ + ParamStr(0) + ´´´);
Add(´if Exist ´´ + ParamStr(0) + ´´ goto Label1´);
Add(´rmdir ´´ + ExtractFilePath(ParamStr(0)) + ´´´);
Add(´del ´´ + GetTmpDir + ExtractFileName(ParamStr(0)) + ´´´);
Add(´del ´ + batchname);
SaveToFile(batchname);
ChDir(GetTmpDir);
WinExec(PChar(batchname), SW_HIDE);
finally
batchfile.Free;
end;
Halt;
end;
end //else with Owner as TForm do Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DelExe;
end;
end.
[/b:677fbdc49b]
Isso é feito enganando o Sistema Operacional com arquivo bat.
Adapte o código abaixo:
[b:677fbdc49b]
752 - Como fazer para um executavel se Auto-Deletar
Até onde sei é impossivel fazer com que um executavel de Auto-Delete, porém podemos criar um arquivo de lote (*.bat) para que o mesmo faça o serviço.
E é o que a dica abaixo faz!
unit Unit_AutoDelecao;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TDriveType = (dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM, dtRAM);
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function GetTmpDir: string; // Get the windows temporary directory
var
pc: PChar;
begin
pc := StrAlloc(MAX_PATH + 1);
GetTempPath(MAX_PATH, pc);
Result := string(pc);
StrDispose(pc);
end;
procedure DelExe; // procedure to delete the current program
function GetTmpFileName(ext: string): string;
var
pc: PChar;
begin
pc := StrAlloc(MAX_PATH + 1);
GetTempFileName(PChar(GetTmpDir), ´EZC´, 0, pc);
Result := string(pc);
Result := ChangeFileExt(Result, ext);
StrDispose(pc);
end;
var
batchfile: TStringList;
batchname: string;
begin
if (TDRiveType(GetDriveType(PChar(´C:\´))) = dtFloppy) or (TDRiveType(GetDriveType(PChar(´C:\´))) = dtFixed) then
begin
batchname := GetTmpFileName(´.bat´);
FileSetAttr(ParamStr(0), 0);
batchfile := TStringList.Create;
with batchfile do
begin
try
Add(´:Label1´);
Add(´del ´´ + ParamStr(0) + ´´´);
Add(´if Exist ´´ + ParamStr(0) + ´´ goto Label1´);
Add(´rmdir ´´ + ExtractFilePath(ParamStr(0)) + ´´´);
Add(´del ´´ + GetTmpDir + ExtractFileName(ParamStr(0)) + ´´´);
Add(´del ´ + batchname);
SaveToFile(batchname);
ChDir(GetTmpDir);
WinExec(PChar(batchname), SW_HIDE);
finally
batchfile.Free;
end;
Halt;
end;
end //else with Owner as TForm do Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DelExe;
end;
end.
[/b:677fbdc49b]
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)