2010-08-11 7 views

risposta

17

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

È 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).

+0

Se viene eseguito in memoria, perché non posso (in Windows) Cancellare il file eseguibile, se il programma è in esecuzione ? –

+5

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. –

+0

Ah, capisco. Questo era principalmente ciò che pensavo sarebbe accaduto. –

5

Alcuni Methods

Si potrebbe anche, utilizzare un qualche tipo di operazione pianificata ...

+0

grande articolo, "Soluzione per XP +" è davvero impressionante – Andrey

4

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.

0

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.

1

std::remove(argv[0]) prima di tornare in principale può farlo.

+0

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

+1

Questo non funzionerà su Windows. –

Problemi correlati