自分自身を削除して終了

作る側としては悲しい事ですが、ソフトが必要とされなくなった場合のことも考えなければなりません。 使用されなくなったソフトは跡を濁さずにさっさと消えてしまってほしいものです。

しかし専用のツールを使わずにアンインストールをしようとすると自分自身を消す必要が出てきます。 そこで自分自身を消そうとDeleteFileで削除しようとしても実行中なのでOSが削除を許してくれません。

ではどうすればいいのか。答えは簡単、別のプログラムから消してもらえばいいのです。 確実にどの環境にも存在して、かつファイルを削除する機能のあるプログラム、 そうそれはcommand.com(およびそれに類するもの)です。 こいつに自分自身を削除するコマンドを送りつけて消してもらいましょう。

// 自分自身を削除して終了
void DeleteSelf() {
// 実行ファイル名の取得
TCHAR MODULEFILENAME[MAX_PATH];
::GetModuleFileName(NULL, MODULEFILENAME, countof(MODULEFILENAME));
 
// 使用するcommand.comの取得
static const TCHAR ENV_COMSPEC[] = _T("COMSPEC");
TCHAR COMSPEC[MAX_PATH];
::GetEnvironmentVariable(ENV_COMSPEC, COMSPEC, countof(COMSPEC));
 
// 自分自身を削除するコマンドラインを生成
static const TCHAR COM_DEL[] = _T("\"%s\" /c del \"%s\"");
TCHAR commandline[1024];
wsprintf(commandline, COM_DEL, COMSPEC, MODULEFILENAME);
 
// DOS窓は隠した状態で実行
STARTUPINFO si = {sizeof (STARTUPINFO)};
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
::CreateProcess(NULL, commandline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
 
// グズグズしないでさっさと終了
::ExitProcess(0);
}

戻る