С++. Функция delme.

Программа не может удалить свой exe-файл, пока она работает. Это фундаментальное правило при работе под Windows. Поэтому все, что остается - это поручить удаление другому процессу прежде, чем завершить операцию. Самый простой вариант - создать на лету и запустить bat-файл, дождется завершения нашего процесса, а затем удалит его exe-файл. Более сложные варианты подразумевают создание в чужом процессе (например, в Task Manager) рабочего потока, который опять же дождется завершения нашего процесса и убьет файл. Вот пример функции, которая создает bat-файл и запускает его, чтобы убить наш exe-файл.
Лучше всего вызвать ее непосредственно перед завершением нашего процесса. void DelSelf () (/ / Получаем свой путь char szExePath [MAX_PATH]; GetModuleFileName (NULL, szExePath, MAX_PATH) / / Создаем bat-файл static char szBat [] = ": Loop \ r \ n" "del% 1 \ r \ n" " if exist% 1 goto Loop \ r \ n "" del% 0 "; HANDLE hFile = CreateFile (" __delself.bat ", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); DWORD temp; WriteFile (hFile, (LPVOID ) szBat, strlen (szBat), & temp, NULL); CloseHandle (hFile) / / Запускаем его STARTUPINFO si; ZeroMemory (& si, sizeof (si)); si.cb = sizeof (si); si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW; PROCESS_INFORMATION pi; char szCommand [MAX_PATH +15] = "__delself.bat"; strcat (szCommand, szExePath); CreateProcess (NULL, szCommand, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, & si, & pi); return;).
Замечу, что это только пример, который можно улучшать в разных направлениях. Можно получить имя bat-файла через GetTempFileName, чтобы гарантировать его уникальность. Или понизить приоритет создаваемого из bat-файла процесса к минимуму, чтобы он "ел" немного меньше ресурсов в процессе циклической проверки существования exe-файла.