Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2007年04月03日] [更新 2015年09月27日] Delphi サンプルプログラム集
850_自分自身を削除するプログラム
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
850_DeadSelf.zip [537 KB] 2015年09月27日版 (EXE 同梱)



  • 2015年09月27日
  • 空白を含むパス名に対応したコードにした
  • Windows 7 U64(SP1) + Delphi XE(UP1) Pro で動作確認




自分自身を削除するプログラム


起動中のアプリケーションの実行ファイル (EXEファイル) を削除するサンプルプログラムです.このプログラムは, の各コード同様,バッチファイルを使用しています.このバッチファイルの中に,起動したプログラムを削除するコマンドを挿入しています.
自分自身を削除するために作成したバッチファイルも,自分自身を削除した後に削除します.


図1
設計時画面
図2
[私を削除] ボタンクリック
  • Project1.BATというファイルができる
図3
削除後のフォルダ内
  • デバッグ中に,EXE を直接起動して削除した場合は,プロジェクトの再構築またはビルドが必要

リスト1
自分自身を削除するプログラム
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  ShellApi;

{$R *.dfm}

//=============================================================================
//  手順
//  (1) このEXEファイルを削除するバッチファイルをこのフォルダ内に作成
//  (2) そのバッチファイルには,自分(バッチファイル)を削除するコードがある
//  (3) EXEの削除を確認したら,バッチファイル自身を削除
//  (4) このプログラムを終了する
//
//  ShellExecuteの使用にはusesにShellApiが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LExeFullPath : String;
  LBatFullPath : String;
  LBatCmdList  : TStringList;
begin
  if DebugHook <> 0 then begin
    MessageBox(Handle, 'デバッグ中は削除できません', '情報', MB_ICONINFORMATION);
    exit;
  end;

  LExeFullPath := ParamStr(0);
  LBatFullPath := ChangeFileExt(LExeFullPath, '.BAT');

  LExeFullPath := AnsiQuotedStr(LExeFullPath, '"');

  LBatCmdList := TStringList.Create;
  //このEXEファイルを削除するバッチファイル作成
  //削除が確認できるまでループする
  try
    LBatCmdList.Add(':Lbl0');
    LBatCmdList.Add('DEL ' + LExeFullPath);
    LBatCmdList.Add('IF EXIST ' + LExeFullPath + ' GOTO Lbl0');
    LBatCmdList.Add('DEL %0');
    LBatCmdList.Add('EXIT');
    LBatCmdList.SaveToFile(LBatFullPath);
  finally
    LBatCmdList.Free;
  end;

  try
    //作成したバッチファイルを実行
    ShellExecute(Handle, '', PChar(LBatFullPath), nil, nil, SW_HIDE);
  except
  end;
  Close;
end;

end.