2010-08-11 4 views
20

सी ++ में कोई प्रोग्राम कैसे लिखें जैसे कि यह निष्पादन के बाद खुद को हटा देगा?सी ++ में प्रोग्राम कैसे लिखें जैसे कि यह निष्पादन के बाद खुद को हटा देगा?

+0

अब तुम क्यों कि, मुझे आश्चर्य है कि क्या करना चाहते हैं: यह मूल रूप से एक .bat फ़ाइल है कि लूप जब तक विनाश sucessful है लॉन्च कर रहा है? –

+6

@Neil: यह एक जाल है! – BoltClock

+0

@Neil: @ 007 की नौकरी पाने के लिए। मुझे वहां नौकरी भी चाहिए, इसलिए मैं किसी भी अच्छे जवाब को उखाड़ फेंक रहा हूं। –

उत्तर

17

यहाँ सी में कोड जो निष्पादन के बाद निष्पादन को नष्ट करेगा है।

#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

यह एक वैध पर्याप्त सवाल है, लेकिन यह आप समझ में नहीं आता कि कैसे काम निष्पादनयोग्य लगता है। निष्पादन प्रोग्राम को स्मृति में रखता है इसलिए डिस्क फ़ाइल को हटाना छोटा होता है (बशर्ते आप रन-टाइम निर्भरता भी हटाएं)।

+0

अगर इसे स्मृति में निष्पादित किया गया है, तो प्रोग्राम क्यों चल रहा है, तो मैं (विंडोज़ में) निष्पादन योग्य क्यों नहीं हटा सकता ? –

+5

निष्पादन स्थान ** मेमोरी में प्रोग्राम के ** भाग ** - बाद में लोड होने के लिए डिस्क पर कई पेज छोड़े जा सकते हैं, यही कारण है कि अधिकांश ओएस आपको निष्पादन प्रक्रिया का प्रतिनिधित्व करने वाली फ़ाइल को हटाने की अनुमति नहीं देते हैं। –

+0

आह, मैं देखता हूं। यह मुख्य रूप से मैंने सोचा था कि क्या होगा। –

5

कुछ Methods

तुम भी, अनुसूचित टास्क किसी तरह का इस्तेमाल कर सकते हैं ...

+0

महान आलेख, "XP + के लिए समाधान वास्तव में शानदार है – Andrey

4

यूनिक्स पर, बस (2) निष्पादन पर अनलिंक कहते हैं।

विंडोज़ पर, आपको मदद करने के लिए दूसरी प्रक्रिया की आवश्यकता है। St0le से प्रतिक्रिया एक डीएलएल को अनलिंक करने के लिए प्रतीत होती है, लेकिन निष्पादन योग्य के लिए, आपको दूसरी प्रक्रिया शुरू करने या मौजूदा प्रक्रिया का उपयोग करने की आवश्यकता होगी, और फिर अपने निष्पादन योग्य को समाप्त कर दें और दूसरी प्रक्रिया को हटा दें।

एक बहुत ही सरल दृष्टिकोण cmd.exe उपयोग करने के लिए मदद करने के लिए होगा।

किसी अन्य प्रक्रिया का उपयोग करने वाला एक सट्टा दृष्टिकोण किसी अन्य प्रक्रिया में कुछ स्मृति आवंटित करना और उस फ़ाइल नाम को रखना है जिसे आप वहां हटाना चाहते हैं, फिर रिमोट प्रक्रिया में निलंबित थ्रेड बनाने के लिए CreateRemoteThread() का उपयोग करें आपके द्वारा आवंटित स्मृति में पॉइंटर के तर्क के साथ हटाएं। फिर अपनी प्रक्रिया से बाहर निकलें, थ्रेड निलंबित गिनती कम होनी चाहिए और फिर हटाएं फ़ाइल को आपकी फ़ाइल को हटाने के लिए बुलाया जाना चाहिए।

मुद्दे: दूरस्थ प्रक्रिया में स्मृति रिसाव, गंदा।

एक आसान तरीका सिर्फ st0le के उत्तर से तकनीकों का उपयोग कर एक सहायक डीएलएल होना चाहिए।

0

हालांकि निष्पादन के बाद फ़ाइल को हटाने के लिए एक तरीका है क्योंकि प्रत्येक अनइंस्टॉलर उस सॉफ़्टवेयर को अनइंस्टॉल करता है जो इसे स्थापित किया गया था & अंतिम शेष फ़ाइल को भी हटा देता है यानी, स्वयं ही ऐसी हार्ड डिस्क में कोई भी फाइल शेष नहीं होगी प्लेटफार्म के बावजूद कुछ रजिस्ट्री प्रविष्टियां इसे स्थापित किया गया है।

1

std::remove(argv[0]) मुख्य में लौटने से पहले यह कर सकता है।

+0

आप वास्तव में 100% सुनिश्चित नहीं हो सकते कि 'argv [0]' निष्पादन योग्य के लिए उचित पथ है। ऐसा माना जाता है, लेकिन कोई प्रवर्तन नहीं है और ऐसे मामले हैं जिनमें यह एक कारण या किसी अन्य कारण से टूटा हुआ है। – dmckee

+1

यह विंडोज पर काम नहीं करेगा। –

संबंधित मुद्दे