Это довольно известный метод, который был задокументирован в MSDN некоторое время назад.Этот метод работает как в Windows 95, так и в Windows NT.Это работает, потому что командные файлы MS-DOS могут удалять сами.Чтобы проверить эту технику, создайте небольшой пакетный файл, содержащий одну команду:
del %0.bat
Пакетный файл при запуске удаляет себя и выдает ошибку «Пакетный файл не найден».Эта ошибка - просто сообщение, поэтому ее можно смело игнорировать.Само по себе это не слишком полезно, но когда модифицировано для удаления нашего исполняемого файла, оно решает нашу проблему, хотя и довольно сильно.Наш исполняемый файл создаст пакетный файл (называемый C: \ DelUs.bat) со следующим содержимым:
:Repeat
del "C:\MYDIR\MYPROG.EXE"
if exist "MYPROG.EXE" goto Repeat
rmdir "C:\MYDIR"
del "\DelUS.bat"
Этот пакетный файл многократно пытается удалить указанный файл и будет непрерывно потреблять процессор, пока не добьется успеха,Когда исполняемый файл удален, пакетный файл затем удаляется сам.
Исполняемый файл должен порождаться из пакетного файла с помощью CreateProcess, а затем должен немедленно завершиться.Было бы неплохо дать потоку выполнения командного файла низкий приоритет, чтобы он не занимал много времени выполнения до тех пор, пока не завершится исходный исполняемый файл.
Читайте всю статью на http://www.catch22.net/tuts/self-deleting-executables который содержит полный код этой техники.