Deletando o executável atual
Estava procurando uma maneira de deletar o executável atual, e uma maneira muito interessante de fazer isso é criar um arquivo batch que deleta o executável e se auto-deleta - os arquivos batch podem se auto deletar. Isto é feito da seguinte maneira:
var
Lista : TStringList;
begin
Lista := TStringList.Create;
try
Lista.Add('del "'+ParamStr(0)+'"');
Lista.Add('del delexec.bat');
Lista.SaveToFile('delexec.bat');
finally
Lista.Free;
end;
WinExec('delexec.bat',SW_HIDE);
close;
end;
Com isto, o programa ceia um batch que deleta o programa e se deleta, salva-o, executa-o e sai. O batch deleta ambos os arquivos.
2 Comentários:
Acho que isso funciona também:
procedure DeleteSelf;
var
module : HMODULE;
buf : array [ 0 .. MAX_PATH - 1 ] of char;
p : ULONG;
hKrnl32 : HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary : pointer;
begin
module := GetModuleHandle ( nil );
GetModuleFileName ( module, buf, sizeof ( buf ) );
CloseHandle ( THandle ( 4 ) );
p := ULONG ( module ) + 1;
hKrnl32 := GetModuleHandle ( 'kernel32' );
pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
asm
lea eax, buf
push 0
push 0
push eax
push pExitProcess
push p
push pDeleteFile
push pFreeLibrary
ret
end;
end;
(perdoe a formatação, não sei como indentar nesse comentário)
Este código não funcionou aqui: o DeleteFile não deleta o arquivo em uso. Isso que você fez é equivalente a:
// Pega o Handle do programa
module := GetModuleHandle ( nil );
// Pega o nome do programa
GetModuleFileName (module, buf, sizeof ( buf ));
// Fecha saída de erro padrão
CloseHandle ( THandle ( 4 ) );
// Fecha o processo
ExitProcess(0);
// Deleta o arquivo
DeleteFile(Buf);
Postar um comentário
<< Home