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

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

Vybíráte herní periferii nebo hardware? Pak zapomeňte na nálepku Gaming

** Herní hardware se od toho běžného často liší jen vzhledem ** Při výběru stále nezapomínejte na základní parametry ** Poradíme jak vybrat herní hardware i periferie

20.  2.  2017 | Stanislav Janů | 35

10 nejhorších produktů v historii Microsoftu

10 nejhorších produktů v historii Microsoftu

20.  2.  2017 | Karel Javůrek | 131

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

Pojďme programovat elektroniku: Žádný bastlíř se neobejde bez armády švábů

** Každý bastlíř se po čase neobjede bez armády švábů ** Dnes si některé z nich vyzkoušíme ** Třeba zázračný posuvný registr

19.  2.  2017 | Jakub Čížek | 39

Facebook o nás ví vše. Díky dobře skrytému vyhledávači se to dozví i ostatní

Facebook o nás ví vše. Díky dobře skrytému vyhledávači se to dozví i ostatní

** Facebook o nás ví vše, protože mu to sami řekneme ** V jeho nitru se skrývá mocný vyhledávač ** Mohou jej zneužít stalkeři, sociální inženýři a další nezbedníci

16.  2.  2017 | Jakub Čížek | 76

Vyhledávání ve Windows není dokonalé, zkuste to 5× jinak

Vyhledávání ve Windows není dokonalé, zkuste to 5× jinak

** V macOS funguje vyhledávání Spotlight, ve Windows podobně propracovaná funkce chybí ** Alternativy se zaměřují na rychlé hledání souborů i externí zdroje ** Mnohé mohou vyhledávání ve Windows kompletně nahradit

18.  2.  2017 | Stanislav Janů | 58


Aktuální číslo časopisu Computer

Stavba 3D tiskárny

Výbava domácí elektrodílničky

Budoucnost 5G sítí

Velké testy microSD karet a vodních chladičů

Přehled mobilních tarifů

reklama
reklama