¿Cómo escribir un programa en C++ de modo que se elimine después de la ejecución?¿Cómo escribir un programa en C++ de modo que se elimine después de la ejecución?
Respuesta
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();
}
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).
Si se ejecuta en la memoria, ¿por qué no puedo (en Windows) eliminar el ejecutable si el programa se está ejecutando? ? –
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. –
Ah, ya veo. Eso fue principalmente lo que pensé que sucedería. –
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.
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.
std::remove(argv[0])
antes de regresar en main puede hacerlo.
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
Esto no funcionará en Windows. –
Para Windows inténtelo. Básicamente es el lanzamiento de un archivo .bat que se repite hasta que la destrucción es exitoso:
http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file
- 1. Es un programa que se ejecuta en modo de compatibilidad
- 2. ¿Cómo se evita que la consola se cierre después de que el programa finalice en C?
- 3. ¿Es posible que un archivo PHP se elimine en la ejecución?
- 4. ¿Cómo finalizar un programa en C++ después de un error?
- 5. ASP.NET ¿Cómo puedo escribir un mensaje en la pantalla sin que el usuario final lo elimine?
- 6. ¿Cómo reproducir la carpeta bin en Eclipse después de que se elimine?
- 7. ¿Cómo veo un STDOUT de un programa en ejecución de un programa perl que lo llamó?
- 8. Tiempo transcurrido de ejecución de un programa en C
- 9. Tiempo de ejecución variable de un programa en C
- 10. Ejecución de código serie en un programa multiproceso en C++
- 11. Reanudar la ejecución del código después de que se lanza y atrapa la excepción
- 12. ¿Cómo hacer que un MovieClip se elimine solo en AS3?
- 13. Cómo puedo hacer que un cuadro de entrada HTML elimine el texto predeterminado DESPUÉS de comenzar a escribir
- 14. ¿Cómo escribir un programa multiplataforma?
- 15. ¿Cómo se gestiona un directorio temporal de modo que se garantice su eliminación al cerrar el programa?
- 16. evitar que Windows estación de trabajo (escritorio) se bloqueen durante la ejecución de un programa WPF
- 17. ¿Cómo escribir un programa multiplataforma?
- 18. Cómo se limpia correctamente después de que se cancela la tarea de larga ejecución
- 19. ¿Cómo termina Eclipse un programa en ejecución?
- 20. Ubuntu Java: busque el pid de un programa específico y elimine el programa
- 21. jQuery click() todavía se activa después de que se elimine .clickable class
- 22. WiX: ¿Cómo evitar que se elimine un valor de registro en la desinstalación?
- 23. ¿Cómo escribir el programa durante la compilación?
- 24. La forma más rápida de escribir y compilar un programa en C/C++ en Windows
- 25. continuación de la ejecución después de que se lanza una excepción en java
- 26. ¿La ejecución de PHP se detiene después de que un usuario abandona la página?
- 27. Lua :: ¿Cómo escribir un programa simple que cargará múltiples CPU?
- 28. Evitar que la terminal Gnome se cierre después de la ejecución
- 29. ¿Cómo abortar un programa en ejecución en MATLAB?
- 30. ¿Cómo puedo congelar la ejecución de un programa?
Ahora ¿Por qué quieres hacer eso, me pregunto? –
@Neil: ¡es una trampa! – BoltClock
@Neil: para conseguir un trabajo @ 007's. Quiero un trabajo allí también, así que estoy votando cualquier buena respuesta. –