Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как программе удалить саму себя?

01.01.2007

Первый способ:

uses 
 
Windows, SysUtils;
 
procedure
DeleteMe;
var
 
BatchFile: TextFile;
 
BatchFileName: string;
 
ProcessInfo: TProcessInformation;
 
StartUpInfo: TStartupInfo;
begin
 
{ создаём бат-файл в директории приложения }
 
BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat';
 
 
{ открываем и записываем в файл }
 
AssignFile(BatchFile, BatchFileName);
 
Rewrite(BatchFile);
 
 
Writeln(BatchFile, ':try');
 
Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
 
Writeln(BatchFile,
   
'if exist "' + ParamStr(0) + '"' + ' goto try');
 
Writeln(BatchFile, 'del "' + BatchFileName + '"');
 
CloseFile(BatchFile);
 
 
FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
 
StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
 
StartUpInfo.wShowWindow := SW_HIDE;
 
 
if CreateProcess(nil, PChar(BatchFileName), nil, nil,
     
False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
     
ProcessInfo) then
 
begin
   
CloseHandle(ProcessInfo.hThread);
   
CloseHandle(ProcessInfo.hProcess);
 
end;
 
end;

А вот тот же способ, но немного модифицированный:

program delete2; 
 
uses
 
SysUtils,
  windows
;
 
var
   
BatchFile: TextFile;
   
BatchFileName : string;
   TM
: Cardinal;
   
TempMem : PChar;
 
begin
   
BatchFileName:=ExtractFilePath(ParamStr(0))+ '$$336699.bat';
 
 
   
AssignFile(BatchFile, BatchFileName);
   
Rewrite(BatchFile);
 
   
Writeln(BatchFile,':try');
   
Writeln(BatchFile,'del "' + ParamStr(0) + '"');
   
Writeln(BatchFile,'if exist "' + ParamStr(0) + '" goto try');
   
Writeln(BatchFile,'del "' + BatchFileName + '"');
   
CloseFile(BatchFile);
 
   TM
:=70;
   
GetMem (TempMem,TM);
   
GetShortPathName (pchar(BatchFileName), TempMem, TM);
   
BatchFileName:=TempMem;
   
FreeMem(TempMem);
 
   winexec
(Pchar(BatchFileName),sw_hide);
 
   halt
;
 
end.

Второй способ:

procedure DeleteSelf; 
var
 
module: HModule;
  buf
: array[0..MAX_PATH - 1] of char;
  p
: ULong;
  hKrnl32
: HModule;
  pExitProcess
,
  pDeleteFile
,
  pFreeLibrary
: pointer;
begin
 
module := GetModuleHandle(nil);
 
GetModuleFileName(module, buf, SizeOf(buf));
 
CloseHandle(THandle(4));
  p
:= ULONG(module) + 1;
  hKrnl32
:= GetModuleHandle('kernel32');
  pExitProcess
:= GetProcAddress(hKrnl32, 'ExitProcess');
  pDeleteFile
:= GetProcAddress(hKrnl32, 'DeleteFileA');
  pFreeLibrary
:= GetProcAddress(hKrnl32, 'FreeLibrary');
 
asm
    lea eax
, buf
    push
0
    push
0
    push eax
    push pExitProcess
    push p
    push pDeleteFile
    push pFreeLibrary
    ret
 
end;
end;

Взято из https://forum.sources.ru