2012-06-25 82 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),然後檢測父進程何時退出,刪除父進程進程並最終殺死子進程。

您可以在這些推薦資源中找到關於此主題的更多信息。