Tipy a triky v Delphi, díl 199. - mazání aplikace po jejím ukončení

Smazat po sobě stopy, to je náplní dnešního dílu. Nebudeme ale ani mazat historii internetového prohlížeče nebo seznam naposledy otevřených dokumentů, ale smažeme přímo naší aplikaci, jakmile bude ukončena.

Je to sice poněkud kontroverzí příklad, ale jistě najdete situace, kdy bude použitelný. A nemusí to být zrovna nějaká nekalá činnost. Celý program je vlastně složen z několika jednoduchých funkcí, o kterých jsme si již během našeho seriálu nejednou říkali. Nejprve si tedy povíme, jaký bude postup.

Nebude to sice možná příliš "hi-tech" způsob, ale využijeme starý dobrý dávkový soubor. Postup bude tedy takový, že nejprve pomocí funkce GetTmpDir zjistíme cestu ke složce pro dočasné soubory. Poté si vygenerujeme unikátní název pro náš dočasný dávkový soubor. A pak už zbývá jen vygenerovat samotný soubor.

Ten vlastně obsahuje jednoduchý "cyklus", který testuje, zda existuje soubor s naší aplikací. Příslušné cesty i název aplikace získáme klasickým způsobem prostřednictvím funkce ParamStr. Pokud existuje, smaže jej, resp. pokusí se jej smazat. To dělá do té doby, dokud se to nepovede. Poté se cyklus ukončí a dávkový soubor nakonec smaže sám sebe. Dávkový soubor bude vypadat přibližně takto:

:Label1
del "C:\pom\Project1.exe"
if Exist "C:\pom\Project1.exe" goto Label1
rmdir "C:\pom\"
del C:\DOCUME~1\ADMN~1\LOCALS~1\Temp\uis136F.bat

Abychom tedy docílili toho, že bude aplikace automaticky smazána po svém ukončení, spustíme kód příslušné procedury například v události OnClose hlavního formuláře. Hlavní mazací procedura nejprve připraví zmiňovaný dávkový soubor, spustí jej a poté dojde k poněkud násilnému ukončení aplikace prostřednictvím procedury Halt. V případě, že to není pro vaši aplikaci ideální řešení, můžete zakončení provést i bezpečnějším způsobem, předem uzavřít všechny rozpracované soubory, uvolnit paměť a podobně. Ve většině případů však bude Halt stačit, i když jsem si vědom, že to není nejčistší řešení.

Dnešní ukázková aplikace tedy bude velmi jednoduchá, bude se skládat jen z prázdného formuláře a veškerý kód bude uvnitř procedury. Kompletní kód vypadá takto:

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure DelEXE;
function GetTmpDir: string; var pc: PChar; begin pc := StrAlloc(MAX_PATH + 1); GetTempPath(MAX_PATH, pc); Result := string(pc); StrDispose(pc); end;
function GetTmpFileName(ext: string): string; var pc: PChar; begin pc := StrAlloc(MAX_PATH + 1); GetTempFileName(PChar(GetTmpDir), `uis`, 0, pc); Result := string(pc); Result := ChangeFileExt(Result, ext); StrDispose(pc); end;
var batchfile: TStringList; batchname: string; begin batchname := GetTmpFileName(`.bat`); FileSetAttr(ParamStr(0), 0); batchfile := TStringList.Create; batchfile.add(`:Label1`); batchfile.add(`del "` + ParamStr(0) + `"`); batchfile.add(`if Exist "` + ParamStr(0) + `" goto Label1`); batchfile.add(`rmdir "` + ExtractFilePath(ParamStr(0)) + `"`); batchfile.add(`del ` + batchname); batchfile.SaveToFile(batchname); ChDir(GetTmpDir); ShowMessage(`Program bude nyni smazan`); WinExec(PChar(batchname), SW_HIDE); Halt; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin DelExe; end;
end.

V reálné aplikaci bychom se samozřejmě neobtěžovali s upozorňováním uživatele na smazání aplikace, v naší ukázce je to pouze pro přehlednost. Dávkový soubor se rovněž pokusí smazat adresář, ve kterém se aplikace nachází. Tento řádek můžete pochopitelně odstranit nebo kompletní dávkový soubor upravit podle vlastních potřeb.

Témata článku: Software, Prohlížeče, Programování

15 komentářů

Nejnovější komentáře

  • Jokon 8. 4. 2007 10:49:09
    Nemelo by byt pred tou adresou ParamStr(0) jeste prevod na dosovskou 8.3...
  • Pavel 16. 9. 2005 9:08:13
    No možná sis všimnul řádku "batchname := GetTmpFileName(
  • TyTyK 9. 9. 2005 12:08:05
    Nechápu... Přece mezi try a except mohu dát i předchozí verzi přiřazení....
Určitě si přečtěte

Nebuďte jako Emma Watson. Poradíme, jak nepřijít o hanbaté fotky

Nebuďte jako Emma Watson. Poradíme, jak nepřijít o hanbaté fotky

** Pokud už choulostivé snímky vyfotíte, dbejte na jejich zabezpečení ** Útočníci je nejčastěji získají z cloudového úložiště ** Pozor si dejte i na phishing a řádné zabezpečení telefonu

25.  3.  2017 | Stanislav Janů | 48

Špičkoví hackeři útočili na prohlížeče. Chrome odolal, ale Edge je tragédie

Špičkoví hackeři útočili na prohlížeče. Chrome odolal, ale Edge je tragédie

** Do Vancouveru se sjeli hackeři ** Soutěžili v útocích na prohlížeče ** Chrome odolal, ale Edge to projel na celé čáře

22.  3.  2017 | Jakub Čížek | 79

Google představil nový Android O. Na co se můžeme těšit?

Google představil nový Android O. Na co se můžeme těšit?

** Google vypustil vývojářskou verzi nového Androidu ** Přinese lepší notifikace nebo prodlouženou výdrž ** K uživatelům se dostane na podzim

22.  3.  2017 | Stanislav Janů | 61


Aktuální číslo časopisu Computer

Supertéma o počítačové bezpečnosti

AMD Ryzen přichází

Velké testy kinoprojektorů a levných sluchátek

Příslušenství do USB-C