2012-06-25 3 views
6

Làm cách nào để tự động xóa, chương trình Delphi của tôi? Tôi đã thử mã này:Delphi tự xóa chương trình

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; 

Nhưng nó không hoạt động, không xóa tệp. Chương trình của tôi là giao diện điều khiển. Cảm ơn!

+0

Bạn đang thực sự cố gắng làm gì? Có gì sai với chỉ cần thoát? Điều này trông giống như một chuyến đi ngược lại đến Win16. – bmargulies

+1

Cách duy nhất tôi thấy điều này có thể là bằng cách gọi một chương trình khác (hoặc tệp bó) thực hiện điều này khi ứng dụng thoát. Đó là nghĩa đen không thể cho một ứng dụng để xóa tự của nó mà không phụ thuộc vào một người trợ giúp bên ngoài để làm như vậy. –

+0

Vì vậy, giải pháp duy nhất là tạo một tệp. Gậy? –

Trả lời

13

Mã của bạn chỉ sẽ hoạt động trong Windows NT và 2000. Bởi vì trong các hệ điều hành này, hệ thống giữ một tham chiếu xử lý usermode cho tệp ánh xạ bộ nhớ sao lưu ảnh thực thi trên đĩa. Tay cầm này luôn có giá trị 0x4 trong các phiên bản Windows này. Cách hiệu quả nhất để xóa exe của riêng bạn, là tạo ra một tiến trình con trong trạng thái treo, tiêm mã để chờ quá trình cha mẹ (exe để xóa), sau đó phát hiện khi quá trình cha mẹ thoát, xóa cha/mẹ quá trình và cuối cùng giết quá trình con.

Bạn có thể tìm thấy thêm về chủ đề này trong các tài nguyên được giới thiệu này.