[C++] Само удаление программы

r3xq1

Проверенный
Проверенный
r3xq1

r3xq1

Проверенный
Проверенный
Сообщения
53
Реакции
29
Код для само удаления программы после выполнения всех функций

Вариант первый:

C++:
#include <iostream>
#include <windows.h>

void autoDelete()
{
    TCHAR szFile[MAX_PATH], szCmd[MAX_PATH];
    if ((GetModuleFileName(0, szFile, MAX_PATH) != 0) && (GetShortPathName(szFile, szFile, MAX_PATH) != 0))
    {
        lstrcpy(szCmd, "/c del ");
        lstrcat(szCmd, szFile);
        lstrcat(szCmd, " >> NUL");
        if (GetEnvironmentVariable("ComSpec", szFile, MAX_PATH) != 0)  ShellExecute(0, 0, szFile, szCmd, 0, SW_HIDE);
    }
    exit(0);
}

int main()
{
    autoDelete();
    return 0;
}
Вариант второй: (без использования командного файла)

C++:
#include <Windows.h>
#include <stdlib.h>
#include <tchar.h>

/////////////////////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE h, HINSTANCE h2, LPSTR psz, int n)
{
     // Это оригинальный EXE-файл или клон ?
// Исходный EXE получает один аргумент,
// клон больше. 
   if (__argc == 1) 
   {
      // Оригинальный EXE: Запустит клон. 
     // Скопируем EXE во временную директорию 
      TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
      GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
      GetTempPath(_MAX_PATH, szPathClone);
      GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
      CopyFile(szPathOrig, szPathClone, FALSE);

      // Откроем клон с помощью FILE_FLAG_DELETE_ON_CLOSE
      HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,
                           OPEN_EXISTING,FILE_FLAG_DELETE_ON_CLOSE);

      // Запустите клон. Передайте PID и полный путь
      // или оригинальный файл
      TCHAR szCmdLine[512];
      HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,
                                        GetCurrentProcessId());
      wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone,
               hProcessOrig, szPathOrig);
      STARTUPINFO si;
      ZeroMemory(&si, sizeof(si));
      si.cb = sizeof(si);
      PROCESS_INFORMATION pi;
      CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0,
                    NULL, NULL, &si, &pi);
      CloseHandle(hProcessOrig);
      CloseHandle(hfile);

      // Теперь оригинальный процесс может прекратиться
      } else {

      // Clone-EXE: удалит оригинальный EXE после завершения
      HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
      WaitForSingleObject(hProcessOrig, INFINITE);
      CloseHandle(hProcessOrig);
      DeleteFile(__targv[2]);
   }
   return(0);
}
Ещё один вариант:
C++:
#include <windows.h>
#include <strsafe.h>

#define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del /f /q \"%s\"")

void SelfDeleteApp() {

    TCHAR szModuleName[MAX_PATH], szCmd[2 * MAX_PATH];
    STARTUPINFO si = { 0 };
    PROCESS_INFORMATION pi = { 0 };

    GetModuleFileName(NULL, szModuleName, MAX_PATH);
    StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName);
    CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);

    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
}
Затем просто вызываем в конце метод SelfDeleteApp
C++:
int _tmain(int argc, char **argv){
 SelfDeleteApp();
}
 
Последнее редактирование:

Сверху Снизу