reklama

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í....
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 104

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 36

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 74

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

** V notebooku s cenou nad 20 tisíc nesmí chybět kvalitní displej a rychlé úložiště ** Za dalších deset tisíc můžete dostat navíc styl nebo výkonnější komponenty ** Vybírat můžete z různých velikostí i konstrukcí

8.  12.  2016 | Stanislav Janů | 85


reklama