フォト

他のアカウント

Mixi Twitter

最近のトラックバック

VOCALOID

無料ブログはココログ

« イリスのアトリエを遊ぶ | トップページ | マクロスゼロ 第4章 »

2004/06/02

起動したExeの実行が終了するのを待つ

プログラムから別のプログラムを起動し、それが終了するのを待つ、という処理を組む必要がありました。
調べていくと、WaitForSingleObject()を使うという方法があることが分かりました(C/C++の話)。
たとえばこんな感じのソースです。

{
char* pComName = "C:\\Program\\Sample.exe";

STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(STARTUPINFO));
memset(&pi, 0, sizeof(PROCESS_INFORMATION));

si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;

if (CreateProcess(NULL, pComName, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
CloseHandle(pi.hThread);

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
return;
} else {
AfxMessage("起動失敗");
return;
}
}

まあこれでも良いのですが…

※上に書いたソースに対しては、何も責任を持ちませんので、コピるのは自らの責任で行ってください。

これだと、呼出元のプログラムで再描画が処理されないので、呼出元のウィンドウの上に他のウィンドウを通過させると、呼出元のウィンドウ上の文字が消えたりと、ちょっとよろしくないです。

ということなので、さらに少し調べて、もうちょっときれいな方法を見つけました。

{
char* pComName = "C:\\Program\\Sample.exe";

STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(STARTUPINFO));
memset(&pi, 0, sizeof(PROCESS_INFORMATION));

si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;

DWORD ret;
MSG msg;

if (CreateProcess(NULL, pComName, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
CloseHandle(pi.hThread);

// ここで終了待ちする
do {
ret = MsgWaitForMultipleObjects(1, &pi.hProcess, FALSE, INFINITE, QS_PAINT|QS_SENDMESSAGE);
if (ret == (WAIT_OBJECT_0 + 1)) {
while (PeekMessage(&msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE)) {
DispatchMessage(&msg);
}
}
} while (ret != WAIT_OBJECT_0);

CloseHandle(pi.hProcess);

// 不必要なメッセージを捨てる
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE));
return;
} else {
AfxMessage("起動失敗");
return;
}
}

これだと、呼出元のウィンドウの再描画も行われるので、見栄えも良いです。
多分今回の問題はこれでクリアできるんじゃないかなと思っています。

※上に書いたソースに対しては、何も責任を持ちませんので、コピるのは自らの責任で行ってください。

« イリスのアトリエを遊ぶ | トップページ | マクロスゼロ 第4章 »

「パソコン・インターネット」カテゴリの記事

「日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/32773/701677

この記事へのトラックバック一覧です: 起動したExeの実行が終了するのを待つ:

« イリスのアトリエを遊ぶ | トップページ | マクロスゼロ 第4章 »

最近の写真

  • P10100061
  • P10100011
  • P10009812
  • P100098011
  • P100097711
  • P10009711
  • P10009671
  • P10009921_2
  • P10009621_2