A volte potrebbe capitare di avere la necessità che un file eseguibile elimini se stesso, come ad esempio nel caso di un file di disinstallazione, in questo modo non avremo bisogno di riavviare il pc e non avremo più alcuna traccia del programma.
Dato che è impossibile cancellare o spostare un file eseguibile durante la sua esecuzione, bisogna ricorrere ad un secondo processo che esegua questa operazione al suo posto.
La maniera più semplice e veloce è tramite un file .bat all'interno del quale dovremo inserire il comando di cancellazione dell'eseguibile e del file batch stesso.
Nella seguente applicazione è presente una procedura che fa proprio questo:
program AutoDelete;
{$APPTYPE CONSOLE}
uses
SysUtils,windows;
procedure DeleteMe;
var
BatchFile: TextFile;
BatchFileName,FileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
FileName:=StringReplace(GetCommandLine,'"','',[rfReplaceAll]);
BatchFileName := ChangeFileExt(FileName, '.BAT');
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile, ':TRY');
Writeln(BatchFile, 'DEL "' + FileName + '"'); //elimina l'eseguibile
Writeln(BatchFile, 'IF EXIST "' + FileName + '"' + ' GOTO TRY');
Writeln(BatchFile, 'DEL %0'); //elimina il file .bat
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;
begin
writeln('Programma di prova');
writeln('Al termine della sua esecuzione il file verr automaticamente rimosso');
writeln('Premi un tasto per terminare il programma...');
readln;
DeleteMe; //procedura di auto-eliminazione
end.





