2012-06-25 14 views
6

¿Cómo elimino automáticamente mi programa Delphi? Probé este código:Programa de autodetección de Delphi

procedure DeleteSelf; 
var 
    module : HMODULE; 
    buf : array [ 0 .. MAX_PATH - 1 ] of char; 
    p : ULONG; 
    hKrnl32 : HMODULE; 
    pExitProcess, pDeleteFile, pFreeLibrary : pointer; 
begin 
    module := GetModuleHandle (nil); 
    GetModuleFileName (module, buf, sizeof (buf)); 
    CloseHandle (THandle (4)); 
    p := ULONG (module) + 1; 
    hKrnl32 := GetModuleHandle ('kernel32'); 
    pExitProcess := GetProcAddress (hKrnl32, 'ExitProcess'); 
    pDeleteFile := GetProcAddress (hKrnl32, 'DeleteFileA'); 
    pFreeLibrary := GetProcAddress (hKrnl32, 'FreeLibrary'); 
    asm 
    lea eax, buf 
    push 0 
    push 0 
    push eax 
    push pExitProcess 
    push p 
    push pDeleteFile 
    push pFreeLibrary 
    ret 
    end; 
end; 

Pero no funciona, no elimine el archivo. Mi programa es consola. Gracias!

+0

¿Qué está tratando de hacer realmente? ¿Qué pasa con solo salir? Esto parece un viaje de regreso a Win16. – bmargulies

+1

La única forma en que veo esto posible es llamando a otro programa (o archivo por lotes) que hace esto cuando la aplicación sale. Es literalmente imposible que una aplicación se elimine a sí misma sin depender de otra ayuda externa para hacerlo. –

+0

Entonces, la única solución es crear un archivo. ¿Murciélago? –

Respuesta

13

Su código única funcionará bajo Windows NT y 2000. Debido a que en estos sistemas operativos el sistema mantiene una referencia mango modo de usuario en el archivo de mapeado de memoria que respalda la imagen ejecutable en el disco. Este identificador siempre tiene un valor 0x4 en estas versiones de Windows. La forma más efectiva de eliminar su propio archivo ejecutable es crear un proceso hijo en estado suspendido, insertar el código para esperar el proceso principal (el archivo ejecutable), luego detectar cuando el proceso primario finaliza, eliminar el elemento primario procesar y finalmente matar el proceso hijo.

Puede encontrar más sobre este tema en estos recursos recomendados.

Cuestiones relacionadas