Chciałbym napisać program, który usunie sam siebie bo zamknięciu. Próbowałem na MainForm.onClose
DeleteFile(Application.ExeName);
ale nie działa. Proszę o pomoc, wskazówkę lub kod. Z góry dzięki.
Spróbuj go wrzucić do TEMP'a. Teoretycznie ten katalog jest opróżniany po każdej sesji (chyba ;p). Pewnie znów źle coś interpretuję, ale to mi pachnie wirusem, trojanem albo innym wredno-ware ;>
Temp jako katalog niestety sam sie nie opróżnia należy go czyścic :) Nie da sie usunąć działającego programu, trzeba posiadać inny go usuwający ewentualnie w boot.ini mozna dodac linie kodu go usuwającą. Wówczas zostanie on usunięty w momencie uruchamiania systemu. (Rozwiązanie dla Win XP).
To nie jest ani wirus ani trojan (tym razem nie) - ma to być auto update do innego programy :P. Można na MainForm.OnClose zrobić ShellExecute (chyba), to po prostu zrobię małą instalke, która usunie starą wersje. Chyba, że ktoś ma jakiś lepszy pomysł.
Ten kod przy kolejnym uruchomieniu systemu uruchomi program command.com i skasuje wybrany plik:
procedure TForm1.Button1Click(Sender: TObject);
var
APath: array[0..255] of char;
begin
if GetShortPathName(PChar(ParamStr(0)),APath,SizeOf(APath) - 1) <> 0 then
begin
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey('\Software\Microsoft\Windows\CurrentVersion\RunOnce',True)
then begin
WriteString('Program','command.com /c del ' + APath);
CloseKey;
end;
finally
Free;
end;
end;
end;
Funkcja GetShortPathName jest wywołana ponieważ command.com nie obsługuje długich ścieżek
command.com? toż to konsola dos. chyba raczej cmd.exe, przecież żyjemy w XXI wieku. poza tym jest polecenie del działające bez trybu wsadowego (bez /c się znaczy i tym bardziej bez command.com).
możesz stworzyć plik bat, który będzie w pętli próbował usunąć plik exe aż do skutku, uruchomić go w tle i wyłączyć swój exe. pliki bat, z tego co pamietam, mogą usuwać same siebie, więc może posprzątać i po sobie.
dobosz-san napisał(a)
Chciałbym napisać program, który usunie sam siebie bo zamknięciu. Próbowałem na MainForm.onClose
DeleteFile(Application.ExeName);
ale nie działa. Proszę o pomoc, wskazówkę lub kod. Z góry dzięki.
Kombinujesz tak jak byś chciał zezłomować samochód podczas gdy jeszcze jedzie.:)
Możesz użyć zewnętrznego pliku wsadowego, tzn. wrzucasz poniższy kod do
zdarzenia OnClose:
var
s:string;
f:textfile;
begin
s:='SelfDelete.bat';
s:=ExtractFilePath(ParamStr(0)) + s;
AssignFile(f, s);
Rewrite(f);
Writeln(f, ':f');
Writeln(f, 'del "' + ParamStr(0));
Writeln(f, 'if EXIST "' + ParamStr(0) + '" goto f');
Writeln(f, 'del "' + s);
CloseFile(f);
WinExec(PChar(s), SW_HIDE);
end;
Pzdr.
Marogo
adydan napisał(a)
Nie da sie usunąć działającego programu, trzeba posiadać inny go usuwający
Nie jest to do końca prawda. W systemach Win 9x i WinNT(XP i wyżej nie wchodzą w grę) dało się to zrobić za pomocą kawałka kodu i wstawki asma.
Natomiast grzebiąc w necie i szukając rozwiązania natknąłem się na coś takiego:
http://blogorama.nerdworks.in/comment.aspx?entryID=21
Pokazuję to jedynie jako ciekawostkę, bo wg mnie to strzelanie do muchy z bazooki, a i antywirusy mogą się chyba czepiać.