Come scrivere un programma in C++ in modo che si cancelli da solo dopo l'esecuzione?Come scrivere un programma in C++ in modo che si cancelli da solo dopo l'esecuzione?
risposta
Ecco il codice in C che elimina l'eseguibile dopo l'esecuzione.
#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();
}
È una domanda abbastanza legittima, ma sembra che tu non capisca come funzionano gli eseguibili. L'esecuzione posiziona il programma in memoria, quindi l'eliminazione del file del disco è banale (purché non si eliminino anche le dipendenze di runtime).
Se viene eseguito in memoria, perché non posso (in Windows) Cancellare il file eseguibile, se il programma è in esecuzione ? –
Execution pone ** le parti ** del programma in memoria - molte pagine possono essere lasciate sul disco per essere caricate successivamente, motivo per cui la maggior parte dei sistemi operativi non consente di cancellare il file che rappresenta un processo in esecuzione. –
Ah, capisco. Questo era principalmente ciò che pensavo sarebbe accaduto. –
In Unix, basta chiamare unlink (2) sul file eseguibile.
Su Windows, è necessario un secondo processo per aiutarti. La risposta di st0le sembra essere quella di scollegare una DLL, ma per un eseguibile, è necessario avviare un secondo processo o utilizzare un processo esistente, quindi terminare l'eseguibile e fare in modo che il secondo processo esegua la cancellazione.
Un approccio molto semplice sarebbe utilizzare cmd.exe per aiutare.
Un approccio speculativo che utilizza qualsiasi altro processo potrebbe essere allocare memoria in un altro processo e inserire il nome file che si desidera eliminare lì, quindi utilizzare CreateRemoteThread() per creare un thread sospeso nel processo remoto con un punto di ingresso di DeleteFile con un argomento di un puntatore alla memoria che hai assegnato. Quindi uscire dal processo, il conteggio sospendere thread dovrebbe diminuire e quindi DeleteFile deve essere chiamato per eliminare il file.
Problemi: perdita di memoria nel processo remoto, disordinata.
Un modo più semplice potrebbe essere semplicemente disporre di una DLL di supporto che utilizza le tecniche della risposta di st0le.
Tuttavia c'è un modo per eliminare il file da solo dopo l'esecuzione perché ogni Uninstaller disfa il software che è stato installato da esso & elimina anche l'ultimo file rimanente cioè, in modo tale che nessun file rimarrà nel nostro Hard Disk eccetto alcune voci di registro indipendentemente dalla piattaforma che è stata installata.
std::remove(argv[0])
prima di tornare in principale può farlo.
Non si può effettivamente essere sicuri al 100% che 'argv [0]' contiene un percorso corretto per il file eseguibile. Si suppone che, ma non vi è alcuna applicazione e ci sono casi in cui questo è rotto per un motivo o un altro. – dmckee
Questo non funzionerà su Windows. –
Per Windows, provare questo. E 'fondamentalmente lanciando un file .bat che loop fino alla distruzione è un successo:
http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file
- 1. È possibile scrivere un programma autodistruttivo in C?
- 2. Come si duplica questo programma da solo?
- 3. Come scrivere un programma di cache friendly in C++?
- 4. Come si mantiene la console in chiusura dopo che il programma è terminato in C?
- 5. Come si scrive un programma di filtro in C?
- 6. Linux: scrivere un programma C che controlli una shell
- 7. In che modo const dopo una funzione ottimizza il programma?
- 8. Come si annulla in modo pulito un programma Delphi?
- 9. Esegui un altro programma in Linux da un programma C++
- 10. Come si comprime/decomprime in modo trasparente un file mentre un programma scrive/legge da esso?
- 11. Come si esegue un programma C++ in XCode 4?
- 12. Scrivere un programma "vero" interattivo terminale come vim, htop, ... in C/C++ senza ncurses
- 13. Fare in modo che Windows esegua solo un programma visibile all'utente
- 14. In che modo il DOS carica un programma in memoria?
- 15. Come si esporta un metodo in una DLL CIL in modo che un programma nativo possa chiamarlo?
- 16. Come scrivere un programma multipiattaforma?
- 17. Come terminare un programma C++ dopo un errore?
- 18. In Perl esiste un modo per riavviare il programma attualmente in esecuzione da solo?
- 19. Come impostare jFormattedTextField in modo che consenta solo 2 numeri?
- 20. Un modo di scrivere grandi letterali numerici in C#
- 21. Scrivere un programma che riconosca un suono ed esegua un'azione
- 22. Linux C - implementazione della capacità che un programma può aggiornare da solo
- 23. Come scrivere un programma di auto aggiornamento in Java?
- 24. Qual è il modo corretto in Python per scrivere metodi che richiedono solo un particolare tipo?
- 25. In che modo un programma individua l'indice di un array?
- 26. Come scrivere un semplice compilatore in C/++?
- 27. Il modo migliore per impostare un programma modulare in C#
- 28. Compilare qualsiasi programma in C utilizzando solo "make" (da un Makefile)
- 29. In che modo Windows chiude un programma quando si spegne il computer?
- 30. Come scrivere (grande) XML in un file in C#?
Ora perché si vuole fare questo, mi chiedo? –
@Neil: è una trappola! – BoltClock
@Neil: per ottenere un lavoro @ 007. Anch'io voglio un lavoro anche lì, quindi sto inviando una buona risposta. –