2010-08-11 31 views
20

Làm thế nào để viết một chương trình trong C++ sao cho nó sẽ tự xóa sau khi thực thi?Làm thế nào để viết một chương trình trong C++ sao cho nó sẽ tự xóa sau khi thực thi?

+0

Bây giờ tại sao bạn sẽ muốn làm điều đó, tôi tự hỏi? –

+6

@Neil: đó là một cái bẫy! – BoltClock

+0

@Neil: để nhận được công việc @ 007's. Tôi muốn có một công việc ở đó, vì vậy tôi đang upvoting bất kỳ câu trả lời tốt. –

Trả lời

17

Đây là mã trong C sẽ xóa tệp thi hành sau khi thực thi.

#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

Đó là một câu hỏi đủ hợp pháp nhưng có vẻ như bạn không hiểu cách thực thi hoạt động. Thực thi đặt chương trình vào bộ nhớ để xóa tệp đĩa là không đáng kể (miễn là bạn cũng không xóa các phụ thuộc thời gian chạy).

+0

Nếu nó được thực hiện trong bộ nhớ, tại sao tôi không thể (trong cửa sổ) xóa thực thi nếu chương trình đang chạy ? –

+5

Các vị trí thực thi ** các phần ** của chương trình trong bộ nhớ - nhiều trang có thể được để lại trên đĩa để tải sau, đó là lý do tại sao hầu hết các hệ điều hành không cho phép bạn xóa tệp đại diện cho quá trình thực thi. –

+0

Ah, tôi hiểu rồi. Đó là những gì tôi nghĩ sẽ xảy ra. –

5

Một số Methods

Bạn cũng có thể, sử dụng một số loại Scheduled Task ...

+0

bài viết tuyệt vời, "Giải pháp cho XP +" thực sự tuyệt vời – Andrey

4

Trên Unix, chỉ cần gọi bỏ liên kết (2) trên thực thi.

Trên Windows, bạn cần quy trình thứ hai để trợ giúp bạn. Phản hồi từ st0le dường như là hủy liên kết một DLL, nhưng đối với một tệp thực thi, bạn sẽ cần phải bắt đầu một quy trình thứ hai hoặc sử dụng một quy trình hiện có, và sau đó chấm dứt thực thi của bạn và có quá trình thứ hai thực hiện việc xóa.

Cách tiếp cận rất đơn giản là sử dụng cmd.exe để trợ giúp.

Phương pháp đầu cơ sử dụng bất kỳ quy trình nào khác có thể phân bổ bộ nhớ trong một quy trình khác và đặt tên tệp bạn muốn xóa ở đó, sau đó sử dụng CreateRemoteThread() để tạo chuỗi bị treo trong quá trình từ xa với điểm vào DeleteFile với một đối số của một con trỏ đến bộ nhớ mà bạn đã cấp phát. Sau đó thoát khỏi quá trình của bạn, số lượng đình chỉ chuỗi nên giảm và sau đó DeleteFile nên được gọi để xóa tệp của bạn.

Sự cố: Rò rỉ bộ nhớ trong quá trình từ xa, lộn xộn.

Một cách dễ dàng hơn có thể chỉ là để có một DLL hỗ trợ bằng cách sử dụng các kỹ thuật từ câu trả lời của st0le.

0

Tuy nhiên, có một cách để xóa tệp sau khi thực thi vì mỗi Uninstaller bỏ cài đặt phần mềm đã được cài đặt bởi nó & cũng xóa tệp còn lại cuối cùng, chính nó sao cho không có tệp nào còn lại trong Đĩa cứng của chúng tôi ngoại trừ một số mục đăng ký không phụ thuộc vào nền tảng mà nó đã được cài đặt.

1

std::remove(argv[0]) trước khi trở về chính có thể thực hiện.

+0

Bạn thực sự không thể chắc chắn 100% rằng 'argv [0]' chứa một đường dẫn thích hợp đến tệp thực thi. Nó có nghĩa vụ phải, nhưng không có thực thi và có những trường hợp trong đó điều này là bị hỏng vì một lý do này hay cách khác. – dmckee

+1

Điều này sẽ không hoạt động trên Windows. –

Các vấn đề liên quan