私のアプリケーション (私が取り組んでいるインストーラーのブートストラップ アプリケーションは、いくつかの他のアプリケーション (私のインストーラーと私のインストーラーの前提条件のためのサード パーティのインストーラー) を起動し、それらが完了するのを待つ必要があります。GUI が画面の更新を行えるようにするためにアプリが完了するのを待っている間、アイドル ループ処理に関する Visual Studio ドキュメントの「MFC 互換」の例をガイドラインとして使用して、待機ループにメッセージ ポンプを配置しました。 -派生クラス) は次のとおりです。
if (::CreateProcess(lpAppName, szCmdLineBuffer, NULL, NULL, TRUE, 0, NULL, NULL,
&StartupInfo, &ProcessInfo))
{
::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
if (bWait)
while (dwExitCode == STILL_ACTIVE)
{
// In order to allow updates of the GUI to happen while we're waiting for
// the application to finish, we must run a mini message pump here to
// allow messages to go through and get processed. This message pump
// performs much like MFC's main message pump found in CWinThread::Run().
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!PumpMessage())
{
// a termination message (e.g. WM_DESTROY)
// was processed, so we need to stop waiting
dwExitCode = ERROR_CANT_WAIT;
::PostQuitMessage(0);
break;
}
}
// let MFC do its idle processing
LONG nIdle = 0;
while (OnIdle(nIdle++))
;
if (dwExitCode == STILL_ACTIVE) // was a termination message processed?
{
// no; wait for .1 second to see if the application is finished
::WaitForSingleObject(ProcessInfo.hProcess, 100);
::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
}
}
::CloseHandle(ProcessInfo.hProcess);
::CloseHandle(ProcessInfo.hThread);
}
else
dwExitCode = ::GetLastError();
私が抱えている問題は、ある時点で、このメッセージ ポンプが、このコードの実行時に開いていたウィンドウとウィンドウのメニュー ハンドルを解放しているように見えることです。私はデバッガーでウォークスルーを行いましたが、if (!PumpMessage()) ステートメントの本体に入ることは一度もなかったので、ここで何が起こってウィンドウとメニューハンドルが移動するのかわかりません南。メッセージ ポンプがない場合、待機ループの実行中に GUI が更新できないことを除いて、すべて正常に動作します。
これを機能させる方法について誰かアイデアがありますか? または、bWait が TRUE の場合にワーカー スレッドを起動して 2 番目のアプリを起動したいのですが、これまでスレッドで何もしたことがないので、同期の問題を発生させずに実行する方法についてアドバイスが必要です。 (どちらの場合も、コード例は大歓迎です。)