終了時にプログラムの削除

解決


Delφ厨@初心者  2005-03-14 07:10:09  No: 13750

初めまして、Delφ厨@初心者です。
WinXPsp1の、Delphi6Personalを使用して、Windows用GUIアプリケーションを作成してます(,,´ー`)

そこで質問なんですが作成したアプリケーションを終了した直後に、そのアプリケーションを削除する方法って無いでしょうか。。

普通に Erase();  だと、予想通りファイルアクセスが出来ませんでした。
プロセスが落ちて、アクセスが可能な時での処理って言うのは不可能なんでしょうか。。


Fusa  2005-03-14 07:39:30  No: 13751

Batファイルを利用すると
簡単に削除できますよ。

procedure TForm1.Button1Click(Sender: TObject);
var
  BatFileName: String;
  EraseBatFile: TStringList;
begin
  BatFileName := ChangeFileExt(Application.ExeName, '.bat');
  EraseBatFile := TStringList.Create;
  try
    EraseBatFile.Add(':TOP');
    EraseBatFile.Add('@DEL '+Application.ExeName);
    EraseBatFile.Add('IF EXIST '+Application.ExeName+' GOTO TOP');
    EraseBatFile.Add('@DEL '+BatFileName);

    EraseBatFile.SaveToFile(BatFileName);
  finally
    EraseBatFile.Free;
  end;

  WinExec(PChar(BatFileName), SW_HIDE);
  Application.MainForm.Close;


Delφ厨@初心者  2005-03-14 08:29:30  No: 13752

迅速な対応ありがとうございます。
出来ました。本当に感謝しています^−^


でも  2005-03-14 08:37:44  No: 13753

バッチファイルは残るんじゃないの?


Delφ厨@初心者  2005-03-14 08:41:21  No: 13754

>バッチファイルは残るんじゃないの?

はい、確かに残りました。。


Mr.XRAY  URL  2005-03-14 09:42:55  No: 13755

>はい、確かに残りました。。

バッチファイルで自分自身を削除するには,最後の行を

EraseBatFile.Add('DEL %0');       

とします.Fusaさんの書き間違いでしょう.
(誤字脱字のMr.XRAYよりはひどくないけど... ゴメンなさいFusaさん)


Fusa  2005-03-14 22:41:44  No: 13756

あれ?うちの環境では
    EraseBatFile.Add('@DEL '+BatFileName);
これでバッチファイル自身も消えてくれるのですが
何か環境依存するかな...と思って調べたら

スペースを含むフルパスファイル名ですか!

次のようにするとフォルダに
スペースを含む、含まないにかかわらず動作します。

procedure TForm1.Button1Click(Sender: TObject);
var
  BatFileName: String;
  EraseBatFile: TStringList;
begin
  BatFileName := ChangeFileExt(Application.ExeName, '.bat');
  EraseBatFile := TStringList.Create;
  try
    EraseBatFile.Add(':TOP');
    EraseBatFile.Add('@DEL '+ '"'+Application.ExeName+'"' );
    EraseBatFile.Add('IF EXIST "'+Application.ExeName+'" GOTO TOP');
    EraseBatFile.Add('@DEL '+ '"'+ BatFileName + '"');
//    EraseBatFile.Add('@DEL %0');

    EraseBatFile.SaveToFile(BatFileName);
  finally
    EraseBatFile.Free;
  end;

  WinExec(PChar(BatFileName), SW_HIDE);
  Application.MainForm.Close;
end;

%0の記述は知りませんでした。
こちらの方がきれいです。
勉強になります。


Mr.XRAY  URL  2005-03-15 02:33:54  No: 13757

Fusaさん,大変失礼しました.

>%0の記述は知りませんでした。

%0というのは,コマンドラインの第一引数ですので,Fusaさんのコード
と同じですね.問題はスペースを含むファイル名だったんですね.
習慣的にこちらを使用しているために,勘違いしてしまいました.


Delφ厨@初心者  2005-03-16 02:12:15  No: 13758

>Fusaサン
>Mr.Xrayサン

本当にありがとうございます。出来ました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加