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