С++. Функція 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-файлу.