Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eine exe löscht sich selbst! (https://www.delphipraxis.net/120598-eine-exe-loescht-sich-selbst.html)

AlexII 13. Sep 2008 11:54


Eine exe löscht sich selbst!
 
Hallo ich hab folgenden Code gefunden, eine exe Datei bzw. Programm löscht sich selbst. Ich selber verstehe den Code nicht, deswegen frage ich was hält ihr davon? Wird wirklich alles gelöscht?


Delphi-Quellcode:
procedure SelfEfface;
var
 F: Textfile;
begin
 AssignFile(F,Changefileext(Paramstr(0),'.bat'));
 Rewrite(F);
 Writeln(F,':1');
 Writeln(F, Format('Erase "%s"',[Paramstr(0)]));
 Writeln(F, Format('If exist "%s" Goto 1',[Paramstr(0)]));
 Writeln(F, Format('Erase "%s"',[ChangeFileExt(Paramstr(0),'.bat')]));
 CloseFile(F);
 WinExec(PChar(ChangeFileExt(Paramstr(0),'.bat')),SW_HIDE);
 Halt;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SelfEfface;
end;

mkinzler 13. Sep 2008 11:57

Re: Eine exe löscht sich selbst!
 
Es wird eine .bat erzeugt dann wird die bat gestartet und das Programm beendet. Die Batch welche versucht solange die Exe zu löschen, bis das erfolgreich ist. Anschliessend löscht sie sich selber.

AlexII 13. Sep 2008 12:01

Re: Eine exe löscht sich selbst!
 
Dann kann man den Code ruhig verwenden, wie ich verstehe? Ich hab aber gelesen, dass man das nie hin bekommt, aber es geht doch.

mkinzler 13. Sep 2008 12:03

Re: Eine exe löscht sich selbst!
 
Eine Exe kann sich ja auch nicht selber löschen, über den Umweg der batch geht es aber. :)

AlexII 13. Sep 2008 12:09

Re: Eine exe löscht sich selbst!
 
Ja direkt nicht, ist klar, aber indirekt doch.

Bernhard Geyer 13. Sep 2008 13:27

Re: Eine exe löscht sich selbst!
 
Diese Lösung schläg aber auch fehle wenn die Exe in Verzeichnissen mit beschränkten Zugriff liegt (C:\Programme\...). Dann nützt dir auch eine Batch-Datei nichts.

AlexII 13. Sep 2008 13:37

Re: Eine exe löscht sich selbst!
 
Kann man die Funktion vielleicht erweitern, dass sie in allen Verzeichnissen gut funktioniert?

mkinzler 13. Sep 2008 13:39

Re: Eine exe löscht sich selbst!
 
Nein, weil das Problem nicht am Tool liegt, sondern an den Rechten des angemeldeten Benutzers auf das Verzeichnis, in dem die Anwendung liegt

AlexII 13. Sep 2008 13:44

Re: Eine exe löscht sich selbst!
 
Welche Fehlermeldung kommt denn? Hab XP und bei mir geht's überall.

Da wird bestimmt gefragt, ob man die bat Datei ausführen soll oder nicht, oder doch nicht? Wenn ja einfach erlauben und die bat erledigt ihre Sache, oder?

API 13. Sep 2008 13:53

Re: Eine exe löscht sich selbst!
 
Hi, die .bat könnte auch ins temp-Verzeichnis geschrieben werden.

Delphi-Quellcode:
uses
  ShellAPI;

procedure DeleteSelf;

function GetTmpDir: string;
  var
    pc: PChar;
  begin
    pc := StrAlloc(MAX_PATH + 1);
    GetTempPath(MAX_PATH, pc);
    Result := string(pc);
    StrDispose(pc);
  end;

  function GetTmpFileName(ext: string): string;
  var
    pc: PChar;
  begin
    pc := StrAlloc(MAX_PATH + 1);
    GetTempFileName(PChar(GetTmpDir), 'DeleteSelf', 0, pc);
    Result := string(pc);
    Result := ChangeFileExt(Result, ext);
    StrDispose(pc);
  end;

var
  BatchFile: TStringList;
  BatchFileName: string;
begin
  BatchFileName := GetTmpFileName('.bat');
  FileSetAttr(ParamStr(0), 0);
  BatchFile := TStringList.Create;
  with BatchFile do
  begin
    try
      Add('@echo off');
      Add(':retry');
      Add(Format('Erase "%s"', [ParamStr(0)]));
      Add(Format('If exist "%s" Goto retry', [ParamStr(0)]));
      Add(Format('Erase "%s"', [BatchFileName]));
      SaveToFile(BatchFileName);
      ShellExecute(0, 'Open', PChar(BatchFileName), nil, nil, SW_HIDE);
    finally
      BatchFile.Free;
    end;
    Halt;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz