Delphi FAQ

Jak usunąć program po jego zamknięciu

Adam Boduch

Często spotykany problem - np. w aplikacjach - instalatorach. Mianowicie jak program ma usunąc samego siebie? W tym celu stworzony zostanie program który usunie pliki naszego programu. Program zostanie stworzony w katalogu Windows\Temp, gdyż ten katalogu jest często oprózniany, a nasz program zajmował będzie tylko 18 bajtów! Tak, to będzie program dosowy z rozszerzeniem *.bat, który najpierw usunie naszą aplikacją, a potem samego siebie. A więc oto kod:

uses SysUtils;
 
var
  TF: TextFile;
begin
  PostMessage(Handle, wm_Quit, 0, 0); // zamkniecie naszej aplikacji
 
  AssignFile(TF, '%windir%\Temp\kill.bat'); // zapisz plik
  Rewrite(TF);
  Writeln(TF, ':kill');
  Writeln(TF, 'cd ' + ParamStr(0));
  Writeln(TF, 'del ' + ExtractFileName(ParamStr(0)));
  Writeln(TF, 'if exist ' + ExtractFileName(ParamStr(0))+ ' goto kill');
  Writeln(TF, 'del %0');
  CloseFile(TF);
 
  // uruchom program
  WinExec('%windir%\Temp\kill.bat', sw_Hide);
end.
FAQ

6 komentarzy

Gówniana metoda. Zostawia syf na dysku.

Polecam metody: Process Injection lub Dll Injection. Są śmiesznie proste w napisaniu (wygoglaniu gotowca), a potem użyciu. AV się nie burzą o dziwo.
Wtedy twój soft, usunie inna aplikacja, która zostanie zaszczepiona kodem lub dll-ka, które to usuwają twój soft. Używam tego do aktualizacji swojego softa bez zapisywania żadnych dodatkowych plików na dysku.

Writeln(TF, 'if exist ' + ExtractFileName(ParamStr(0))+ ' goto kill');

Czy to oznacza, że plik będzie "usuwany" póki nie zniknie ?
(Ciekawie by było, gdyby użytkownik nie miał praw do usuwania, lub zablokował usuwanie tego pliku...)

%windir% - C:\Windows

"Zmienne" możemy zobaczyć poprzez polecenie set.

"Program zostanie stworzony w katalogu Windows\Temp, gdyż ten katalogu jest często opróżniany"

Plik bat może usunąć samego siebie poprzez polecenie del:

del "C:\Windows\Temp\kill.bat"

i będzie ok ;-)

Albo jeszcze wygodniej - %TEMP%

A nie istnieje taka zmianna %windir% ??