2012-06-25 12 views
6

मैं अपने डेल्फी कार्यक्रम को कैसे हटा सकता हूं? मैंने इस कोड को आजमाया:डेल्फी स्वयं-हटाना कार्यक्रम

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

आपका कोड केवल विंडोज एनटी और 2000 के तहत काम करेगा। क्योंकि इन ओएस में सिस्टम मेमोरी मैप किए गए फ़ाइल के लिए एक यूजरोड हैंडल संदर्भ रखता है जो डिस्क पर निष्पादन योग्य छवि का समर्थन करता है। इन हैंडल में इन हैंडल में हमेशा 0x4 है।

अपने स्वयं के exe को हटाने का सबसे प्रभावी तरीका, निलंबित राज्य में एक बाल प्रक्रिया बना रहा है, पैरेंट प्रक्रिया (हटाने के लिए exe) की प्रतीक्षा करने के लिए कोड इंजेक्ट करें, फिर पता लगाएं कि जब मूल प्रक्रिया निकलती है, तो माता-पिता को हटा दें प्रक्रिया और अंततः बच्चे की प्रक्रिया को मार डालो।

आप इन अनुशंसित संसाधनों में इस विषय के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

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