作る側としては悲しい事ですが、ソフトが必要とされなくなった場合のことも考えなければなりません。 使用されなくなったソフトは跡を濁さずにさっさと消えてしまってほしいものです。
しかし専用のツールを使わずにアンインストールをしようとすると自分自身を消す必要が出てきます。 そこで自分自身を消そうと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);
- }