Programowanie w języku Delphi » FAQ

W jaki sposób aplikacja może usunąć samą siebie

  • 2006-04-05 16:07
  • 10 komentarzy
  • 1299 odsłon
  • Oceń ten tekst jako pierwszy
We wskazówce Jak usunąć program po jego zamknięciu opisywaliśmy sposób na usunięcie naszej aplikacji używając pliku wsadowego *.bat. W niniejszej wskazówce prezentujemy kolejne rozwiązania, które pozwolą nam usunąć naszą aplikację.

1) W Windowsach z rodziny 9x użuwając INI do pliku WININIT.INI w sekcji [rename] należy dodać wpis o nazwie NUL z wartością równą Application.ExeName, czyli będzie to wyglądać mniej więcej tak:

[rename]
...
NUL="C:\Delphi\Myprog\Myprog.exe"


Informację tę można dodać jak do zwykłego pliku INI (patrz Pliki INI), lecz autorzy pomocy do WinAPI zalecają użycie funkcji WritePrivateProfileString:
WritePrivateProfileString('rename', 'NUL', PChar(GetShortPathName(Application.ExeName)), PChar(GetEnvironmentVariable('windir') + '\wininit.ini'));


Uwaga! Ścieżka w sekcji rename musi być zapisana w formacie 8.3 (krótkie nazwy), do tego celu należy użyć funkcji GetShortPathName (więcej o funkcji można dowiedzieć się z pomocy delphi i z naszego forum).

2) Natomiast w systemach z linii NT (czyli też 2000 i XP) należy uzyć  funkcji MoveFileEx w ten sposób:

MoveFileEx(PChar(Application.ExeName), nil, MOVEFILE_DELAY_UNTIL_REBOOT);


Obie metody są "pewne", tzn. obsługiwane standardowo przez system, natomiast metody alternatywne (tzn. plik bat kasujący plik EXE) mogą mieć pewne niepożądane skutki lub w ogóle nie działać.

Zobacz też:

10 komentarzy

mgyver 2009-12-17 18:06

A ja korzytam z metody Code Injection. Niech mój soft usuwają inne procesy.
Zalety: prostota użycia, nie zostawia śmieci, nie trzeba restartować os'a.
Wady: DEP.

lukasz_kz 2009-08-12 03:03

poprawka do metody SeaSoft : WinExec('del.bat',SW_NORMAL); zamień na WinExec('del.bat',SW_HIDE);
Program uruchomi się w ukryciu, bez "mignięcia" :-)

SeaSoft 2006-06-28 23:19

A ja zrobiłem tak:

Przed zakończeniem program tworzy del.bat, w którym zapisane jest:

   :repeat
   del program.exe
   if exist program.exe goto repeat
   del del.bat

W ostatniej linijce (tuż przez end.):
  WinExec('del.bat',SW_NORMAL);

I już. Działanie natychmiastowe. W bat'cie dałem 'if exists' aby program nie usunął się podczas działania (czyli podczas wywoływania WinExec). Wadą takiego rozwiązania jest "mignięcie" okna konsoli.

ic3 2006-04-15 23:50

a mnie iteresuje czemu taka uwaga jest w FAQ o Delphi, przeciez to sie tyczy takze innych jezykow, tylko ze tu jest specyficzna skladnia. Nie powinno byc jakeigos FAQ ogolnie o programowaniu? -_-

TeWuX 2006-04-05 17:56

nie lepiej zrobić tak:

program1 uruchamia program2, a następnie się sam wyłącza,
program2 usuwa program1.

program2 moze być w zasobach programu1 i moze byc wypakowany do tempu.

bez żadnych kombinacji z rebootem.

Jojersztajner 2006-03-14 12:43

<quote>W jaki sposób aplikacja może usunąć samego siebie</quote>
"aplikacja" jest rodzaju żeńskiego ;)

AndRew 2003-07-21 17:13

azgon, flaga MOVEFILE_DELAY_UNTIL_REBOOT znaczy tyle co : PPRZENOSZENIE_PLIKU_OPÓŹNIONE_DO_CZASU_NASTĘPNEGO_URUCHOMIENIA_WINDOWS

aZgon 2003-07-14 14:54

ok, fajnie tylko co ja mam zrobić z tym:
MoveFileEx(PChar(Application.ExeName), nil,MOVEFILE_DELAY_UNTIL_REBOOT); ??
Przeciez aplikacja sie nie usunie jak jest uruchomiona ...

my_nick 2003-06-29 12:00

No wreszcie ktoś znalazł coś sensownego, nie jakieś metody "na sznurek i taśmę klejącą".

miner 2006-03-12 14:16

do programu jeszcze cos co automatycznie resetuje kompa!

trzeba sie nauczyc angielskiego i z niego korzystac bo MOVEFILE_DELAY_UNTIL_REBOOT to nie jest przypadkowa nazwa tylko sensowne zdanie (nie liczac przedrostka MOVEFILE i zamieniajac _ na spacje) znaczace "opóźnione do restartu"