uses shlobj,shellapi; function Suicide: Boolean; var sei: TSHELLEXECUTEINFO; szModule: PChar; szComspec: PChar; szParams: PChar; begin szModule := AllocMem(MAX_PATH); szComspec := AllocMem(MAX_PATH); szParams := AllocMem(MAX_PATH); // get file path names: if ((GetModuleFileName(0, szModule, MAX_PATH) <> 0) and (GetShortPathName(szModule, szModule, MAX_PATH) <> 0) and (GetEnvironmentVariable('COMSPEC', szComspec, MAX_PATH) <> 0)) then begin // set command shell parameters lstrcpy(szParams, '/c del '); lstrcat(szParams, szModule); // set struct members sei.cbSize := sizeof(sei); sei.Wnd := 0; sei.lpVerb := 'Open'; sei.lpFile := szComspec; sei.lpParameters := szParams; sei.lpDirectory := 0; sei.nShow := SW_HIDE; sei.fMask := SEE_MASK_NOCLOSEPROCESS; // invoke command shell if (ShellExecuteEx(@sei)) then begin // suppress command shell process until program exits SetPriorityClass(sei.hProcess, HIGH_PRIORITY_CLASS); //IDLE_PRIORITY_CLASS); SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); // notify explorer shell of deletion SHChangeNotify(SHCNE_Delete, SHCNF_PATH, szModule, nil); Result := True; end else Result := False; end else Result := False; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Suicide; end;