2 минуса
1. При удалении файла виден консоль от bat файла (палево)
2. Не работает, если в пути к файлу есть русские буквы.
А еще bat файлы могут быть отключены в системе как "выполняемые" и батник тупо не запустится =)
Вариантов самоудаления - масса, самый простой- батник, посложнее - рядом с прогой таскать "модуль обслуживания", ну вроде удаления/обновления и всякого такого и управлять им через строку запуска ака консолько.
Ну есть еще извращения с планировщиком задач.
winexec(PAnsiChar('cmd.exe /c "' + ansistring(BatchFileName)+ '"'),sw_hide); // "@echo off" можно было не писать, но можно и перестраховаться, обратите на параметр "sw_hide"
Еще один вариант - инжект потока в чужой процесс. Поток ждет завершения исполнения файла, после чего его удаляет, например через ZwSetInformationFile с последним параметром FileDispositionInformation и ZwClose.
Соб-но, удалить файл который на данный момент запущен нельзя. Немного переделывал свою защиту, думал о автоматическом удалении.
Построил для себя задачу:
- Создать батник
- Открыть батник
- С помощью батника вырубаем процесс.
- Удаляем.