4

MFCダイアログ内から例外をスローすると、コードにcatchブロックがある場合でも、アプリがハングします。マウスまたはキーボードへの応答を拒否し、シャットダウンする唯一の方法はタスクマネージャーを使用することです。

この質問を投稿する理由

残念ながら、モーダルダイアログで例外的なエラーが発生するたびにハングする人気のシュリンクラップアプリケーションがあります。整数のエラーコードから例外に大幅に移行したとき、スローされた例外の基本クラスとしてstd::exceptionを選択する責任がありました。私たちのテストでこの問題が明らかになったのは、変換に膨大な量の作業が行われるまではなく、それまでに変更するには遅すぎました。うまくいけば、この質問/回答が誰かが同じ間違いをするのを防ぐでしょう。

4

3 に答える 3

8

CDialog::DoModal のコードは、親ウィンドウを無効にすることで、ダイアログをモーダルにします。ダイアログ コードが戻ると、ウィンドウが再度有効になります。CException* エラーには明示的なキャッチがありますが、スローされた他の種類の例外にはありません。したがって、親ウィンドウが再度有効になることはありません。

CException から派生したすべての例外へのポインターをスローするようにコードを変更すると、問題が修正されます。

于 2008-09-27T04:39:24.450 に答える
3

Windows が apphang を検出する方法について知りたい場合は、Windows エラー報告ブログにいくつかの投稿を追加しました。

ハングパート1/4

ハングパート2/4

ハングパート3/4

ハングパート4/4

この情報は、Microsoft の Windows エラー報告を通じて送信されると、ソフトウェア開発者に伝達され、これらの問題を解決しようとすることに注意してください。エラー レポートを送信する場合は、PC で発生している問題の修正に役立ちます。

私は Microsoft の Windows エラー報告チームのプログラム マネージャーです。

于 2009-03-25T04:15:27.577 に答える
1

マークの答えは正しいです。この問題のより厳密な分析と、独自のコードでこの問題を処理するための詳細な提案については、Doug Harrison によるこの FAQ (特にセクション Q6) を参照してください。

于 2010-11-04T19:12:06.393 に答える