Self Delete on Close

0

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.

0

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

0

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

0

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

0

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

0

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.

0
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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1