実行ファイル自身を、実行中に削除するには


RS-774  2009-12-23 23:31:55  No: 36534  IP: 192.*.*.*

delphiで実行ファイルを削除、で検索したところ、自分自身を削除するバッチファイルを書きだして実行する方法や、レジストリに細工をして再起動後に削除させる方法などが見つかりました。

が、実行ファイル中にDeletefileで自分自身を削除するコードを記述して実行するのは、素人考えながらメモリリークとかなんとか問題がありそうだとは思いますが、やはり辞めた方がよいでしょうか。
これらの他に、良いアイデアはありますか。

なお、念のため、削除前に生成したクラスとかファイルの後片付けはきちんと行った後に削除します。

編集 削除
Mr.XRAY  2009-12-24 00:36:46  No: 36535  IP: 192.*.*.*

Mr.XRAYです

>削除前に生成したクラスとかファイルの後片付けはきちんと行った後に削除します。

であれば特に問題はないと思いますが.

編集 削除
Mr.XRAY  2009-12-24 00:48:07  No: 36536  IP: 192.*.*.*

できれば該当アプリケーションを終了させておくといいかも知れません.

編集 削除
jazzin  2009-12-24 15:31:35  No: 36537  IP: 192.*.*.*

それらの方法でバッチやレジストリを使うのは、自身を直接削除することが不可能だからです。
やってみれば分かりますが、自分自身を実行中にDeleteFileすることはできません。
OSがEXEファイルにロックをかけていて、削除するにはバッチやレジストリを使わざるを得ないのです。
また、レジストリで削除する方法に関しては、MoveFileExで移動先(lpNewFileName)をnil、
フラグ(dwFlags)にMOVEFILE_DELAY_UNTIL_REBOOTを指定しても同等の効果が得られますし、
直接レジストリを弄らないので安全確実です。

ちなみにメモリは最近のOSでは終了時にすべて解放してくれるので、
例えばTObject.Createを100個実行したまま終了してもリークはしません。
さらに、実行中のプロセスはEXEファイルのコピーでしかないので、
ロックのことを無視すれば、削除されても実行中のプロセスには影響ありません。
(例えばCD-ROMなどからEXEを起動したあと、CDを取り出しても動くことで確認できます)

編集 削除