Подтвердить что ты не робот

Как написать программу на С++, чтобы она удалилась после выполнения?

Как написать программу на С++, чтобы она удалилась после выполнения?

4b9b3361

Ответ 1

Вот код на 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 \"%s\"")

void DelMe()
{
    TCHAR szModuleName[MAX_PATH];
    TCHAR 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);
}

void main()
{
    /* Do what you need */

    /* Call this function at the very end of your program to delete itself */
    DelMe();
}

Ответ 2

Некоторые Методы

Вы также можете использовать какую-то запланированную задачу...

Ответ 3

В Unix просто вызовите unlink (2) в исполняемом файле.

В Windows вам понадобится второй процесс, который поможет вам. Ответ от st0le, по-видимому, предназначен для разблокировки DLL, но для исполняемого файла вам нужно будет запустить второй процесс или использовать существующий процесс, а затем завершить свой исполняемый файл и выполнить второй процесс.

Очень простой подход заключается в использовании cmd.exe, чтобы помочь.

Спекулятивный подход, который использует любой другой процесс, может состоять в том, чтобы выделить некоторую память в другом процессе и поместить там имя файла, которое вы хотите удалить, а затем использовать CreateRemoteThread() для создания приостановленного потока в удаленном процессе с точкой входа DeleteFile с аргументом указателя на выделенную память. Затем выйдите из процесса, поток suspend count должен уменьшиться, а затем удалить DeleteFile для удаления вашего файла.

Проблемы: утечка памяти в удаленном процессе, запутанная.

Более простой способ может состоять только в том, чтобы иметь поддерживающую DLL, используя методы из ответа st0le.

Ответ 4

std::remove(argv[0]) перед возвратом в main может это сделать.

Ответ 5

Однако есть способ удалить файл самостоятельно после выполнения, потому что каждый Uninstaller отключает установленное им программное обеспечение, а также удаляет последний оставшийся файл, то есть сам, так что на нашем жестком диске не останется никаких файлов, кроме некоторых Записи реестра, независимо от платформы, на которой он был установлен.

Ответ 7

Это достаточно законный вопрос, но, похоже, вы не понимаете, как работают исполняемые файлы. Выполнение помещает программу в память, поэтому удаление файла диска является тривиальным (при условии, что вы также не удаляете зависания во время выполнения).