2010-08-11 12 views

Respuesta

17

Aquí está el código en C que eliminará el ejecutable después de la ejecución.

#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 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(); 
} 
-3

Es una pregunta bastante legítima pero parece que no entiende cómo funcionan los ejecutables. La ejecución coloca el programa en la memoria, por lo que eliminarlo es trivial (siempre que no elimine las dependencias de tiempo de ejecución).

+0

Si se ejecuta en la memoria, ¿por qué no puedo (en Windows) eliminar el ejecutable si el programa se está ejecutando? ? –

+5

La ejecución coloca ** partes ** del programa en la memoria: pueden quedar muchas páginas en el disco para cargarlas más tarde, por lo que la mayoría de los sistemas operativos no le permiten eliminar el archivo que representa un proceso de ejecución. –

+0

Ah, ya veo. Eso fue principalmente lo que pensé que sucedería. –

5

Algunos Methods

También podría, utilizar algún tipo de tarea programada ...

+0

gran artículo, "Solución para XP +" es realmente increíble – Andrey

4

En Unix, a llamar a unlink (2) en el ejecutable.

En Windows, necesita un segundo proceso para ayudarlo. La respuesta de st0le parece ser la de desvincular un archivo DLL, pero para un archivo ejecutable, necesitaría iniciar un segundo proceso o usar un proceso existente, y luego terminar su ejecutable y hacer que el segundo proceso elimine.

Un enfoque muy simple sería utilizar cmd.exe para ayudar.

Un enfoque especulativo que utiliza cualquier otro proceso podría ser asignar memoria en otro proceso y poner el nombre de archivo que desea eliminar allí, luego use CreateRemoteThread() para crear un hilo suspendido en el proceso remoto con un punto de entrada de DeleteFile con un argumento de un puntero a la memoria que asignó. A continuación, salga de su proceso, el conteo de suspensión de subprocesos debería disminuir y luego se debe llamar a DeleteFile para eliminar su archivo.

Problemas: pérdida de memoria en el proceso remoto, desordenado.

Una manera más fácil podría ser simplemente tener una DLL de apoyo usando las técnicas de la respuesta de st0le.

0

Sin embargo hay una manera de eliminar el archivo por sí mismo después de la ejecución porque cada desinstalador desinstala el software que instaló & y también elimina el último archivo, es decir, que no quedará ningún archivo en nuestro disco duro, excepto algunas entradas de registro independientemente de la plataforma en la que se haya instalado.

1

std::remove(argv[0]) antes de regresar en main puede hacerlo.

+0

No se puede estar 100% seguro de que 'argv [0]' contiene una ruta adecuada al ejecutable. Se supone que debe hacerlo, pero no hay aplicación y hay casos en que esto se rompe por una razón u otra. – dmckee

+1

Esto no funcionará en Windows. –

Cuestiones relacionadas