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

Johnny_Bit

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:

<tt>[rename]
...
NUL="C:\Delphi\Myprog\Myprog.exe"</tt>

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ż:

FAQ

10 komentarzy

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.

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

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.

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? -_-

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.

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

"aplikacja" jest rodzaju żeńskiego ;)

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

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 ...

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

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"