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

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

** Gary Kildall pochopil, že levné výpočetní čipy mohou posloužit jako univerzální počítače pro všechny ** Připravil pro ně proto první operační systém ** Později mu systém vyfoukl Microsoft a nazval ho MS DOS

23.  4.  2017 | Pavel Tronner | 57

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

** Už je to tady, lidé přestávají chápat počítače ** Systémy neuronových sítí začínají pracovat tak, že ani jejich tvůrci přesně neví, co se uvnitř děje ** Do budoucna to může být závažný problém

24.  4.  2017 | Jakub Čížek | 112

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

** Slavný osmibitový počítač Sinclair ZX Spectrum byl uveden právě před 35 lety ** Připomeňte si tento průkopnický počítač v tematických článcích ** Podívejte se, jak funguje dnes

23.  4.  2017 | Pavel Tronner | 13

Acer chrlí novinky: levný a tenký Predator, nové Switche a další notebooky

Acer chrlí novinky: levný a tenký Predator, nové Switche a další notebooky

** Acer na konferenci v New Yorku představil velkou spoustu novinek z oblasti počítačů, notebooků i monitorů ** Notebookové novinky se dotkly řad Predator, Swift, Switch i Aspire ** Herní notebooky dostaly nový typ chlazení

27.  4.  2017 | Karel Javůrek | 7

Správný počítač má alespoň dva monitory. Anebo je to jinak?

Správný počítač má alespoň dva monitory. Anebo je to jinak?

** David si nedokáže představit práci bez dvou a více monitorů ** Kubovi naopak stačí jeden a ve více displejích se ztrácí ** Jaký přístup je lepší?

23.  4.  2017 | Jakub Čížek | 59


Aktuální číslo časopisu Computer

Supertéma: moderní cestování

Kdy opravdu přijdou nové baterie?

Velké testy: 6 herních notebooků a 8 volantů

Recenze: AMD Ryzen řady 5