2012-06-25 7 views
6

私のDelphiプログラムを自動削除するにはどうしたらいいですか?私はこのコードを試しました: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でのみ動作します。これらのOSでは、システムはディスク上の実行可能イメージをバックアップするメモリマップファイルへのusermodeハンドル参照を保持しています。 これらのWindowsバージョンでは、このハンドルの値は常に0x4です。

あなたのexeを削除する最も効果的な方法は、サスペンド状態の子プロセスを作成し、親プロセス(exeが削除される)を待つコードを注入し、親プロセスが終了したときに検出し、最後に子プロセスを終了します。

これらの推奨リソースでは、このトピックについて詳しく知ることができます。

関連する問題