2004年05月09日

MFCアプリケーションが自身を再起動する方法

環境
Visual C++.NET 2003
ライブラリ
MFC 7.1

アプリケーションの初期化シーケンスをもう一度走らせたい場合など、 アプリケーションが、自身を再起動させたいときがたまにあります。 それを実現する方法です。

手順は以下の通りです。

  1. アプリケーションを実行しているプロセスのIDを取得する。
  2. ::ShellExecuteで自身を起動し、コマンドラインからプロセスのIDを渡す。
  3. 直ちに終了する。
  4. 起動時にコマンドライン引数を確認し、プロセスのIDが存在したら、::WaitForSingleObjectでプロセスがシグナル状態になるまで待つ(プロセスがシグナル状態=プロセス終了)。

サンプルコードを載せておきます。

再起動を行う部分のコードは以下の通りです。

TCHAR strPath[MAX_PATH];
::GetModuleFileName(AfxGetInstanceHandle(), strPath, sizeof(strPath) / sizeof(TCHAR));
TCHAR strCurDir[MAX_PATH];
::GetCurrentDirectory(sizeof(strCurDir) / sizeof(TCHAR), strCurDir);
// 元プロセスのコマンドライン引数を継承する必要があるか検討して下さい。
DWORD dwProcessId = ::GetCurrentProcessId();
CString strCmdLine;
strCmdLine.Format("/waitterminate %u", dwProcessId);
::ShellExecute(NULL, NULL, strPath, strCmdLine, strCurDir, SW_SHOWNORMAL);
// アプリケーションを終了する。
AfxGetMainWnd()->SendMessage(WM_COMMAND, MAKEWPARAM(ID_APP_EXIT, 0), NULL);

CXxxApp::InitInstanceに以下のコードを追加します。

BOOL CXxxApp::InitInstance()
{
	bool bWaitTerminate = false;
	DWORD dwWaitProcessId;
	for (int i = 1; i < __argc; ++i) {
		if (!(__argv[i][0] == '/' || __argv[i][0] == '-')) {
			continue;
		}
		if (_tcsicmp(&__argv[i][1], "waitterminate") == 0) {
			if (++i >= __argc) {
				continue;
			}
			dwWaitProcessId = static_cast(_ttoi(__argv[i]));
			if (dwWaitProcessId != 0) {
				bWaitTerminate = true;
			}
		}
	}
	if (bWaitTerminate) {
		HANDLE hWaitProcess = ::OpenProcess(SYNCHRONIZE, FALSE, dwWaitProcessId);
		if (hWaitProcess != NULL) {
			// 10秒待っても前のプロセスが終了しない場合は、アプリケーションを終了します。
			if (::WaitForSingleObject(hWaitProcess, 10 * 1000) == WAIT_TIMEOUT) {
				return FALSE;
			}
		}
	}
	// CXxxApp::InitInstanceの残りの処理を行う。
}
アイデアそのものはMFCに依存していないので、 ちょっと変更すればMFCを使わなくても実現できると思います。 投稿者 MASATO : 2004年05月09日 22:00 | トラックバック
コメント

Weblogに移行してからの初コメントどうもトありがとうございます。

これからもよろしくお願いします。

Weblog移行により簡単にコメントが付けられるようになりましたのでどんどん突っ込んじゃって下さい。

Posted by: MASATO : 2004年05月11日 23:07

すいません間違えて連続で書き込んでしまいました…。

Posted by: src : 2004年05月10日 23:57

日記はとても参考になります。今後も期待しておりますのでがんばってください。

Posted by: src : 2004年05月10日 23:56

プログラム関連の日記とても参考にさせていただいています。いつのまにかblogになっててビックリしました。

Posted by: src : 2004年05月10日 23:54
コメントする









名前、アドレスを登録しますか?