2012-06-25 87 views
6

如何自动删除,我的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; 

但它不起作用,不要删除文件。我的程序是控制台。 谢谢!

+0

你究竟在做什么?刚退出有什么问题?这看起来像是Win16的一次回望之旅。 – bmargulies

+1

我看到这种可能的唯一方法是调用另一个程序(或批处理文件),在应用程序退出时执行此操作。对于一个应用程序来说,删除自己完全不可能,而不依赖于另一个外部帮手来这样做。 –

+0

所以唯一的解决方案是创建一个文件。蝙蝠? –

回答

13

您的代码只有将在Windows NT和2000下工作。因为在这些操作系统中,系统会保留一个usermode句柄引用,用于支持磁盘上的可执行映像。 在这些Windows版本中,此句柄的值始终为0x4

删除自己的exe最有效的方法是创建一个处于挂起状态的子进程,注入代码以等待父进程(要删除的exe),然后检测父进程何时退出,删除父进程进程并最终杀死子进程。

您可以在这些推荐资源中找到关于此主题的更多信息。