21

Windows MFC C++ を使用します。CWinApp 派生クラスでユーザー定義メソッドを呼び出すサード パーティ アプリがあります。このメソッドは、InitInstance() の後に呼び出されます。このメソッドでエラーが発生し、例外がスローされて try/catch ブロックでキャッチされた場合、catch ブロックからアプリケーションを終了したいと考えています。やめる標準的で正しい方法は何ですか?

アップデート:

Serge 私は、InitInstance() で false を返すことがアプリケーションを終了する正しい方法であると信じています。ただし、CDialog 派生クラスの OnInitDialog() ハンドラーを終了したいとします。これを行う正しい方法は何ですか。

更新 2

私にとっては、非モーダル CDialog 派生クラスから PostMessage(WM_CLOSE) を呼び出すことが最善の方法であることがわかりました。私が試した他のすべての終了方法は、状況によっては何らかの例外またはその他を発生させます。

これが私がそれをどのように使用するかの例です:

BOOL SomeDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    ::OleInitialize(nullptr);

    try
    {
        // ...load settings file here
    }
    catch(...)
    {
        PostMessage(WM_CLOSE);
        return TRUE;
    }

    // return TRUE  unless you set the focus to a control
    return TRUE;
}
4

3 に答える 3

33

InitInstance()で

にいる間にアプリを終了する:からInitInstance()戻るだけです。FALSEInitInstance()

メイン メッセージ ループ内

ただし、既にメッセージ ループに入っている場合は別の話です。アプリを閉じる標準的な方法は、メッセージ ループを終了することです。

PostQuitMessage(0)、その名前が示すように、WM_QUITメッセージを投稿します。メッセージ ループは、ループを終了してプログラムを閉じることによって反応します。

ただし、単純にそれを行うべきではありません。アプリで開いているウィンドウを閉じる必要があります。メイン ウィンドウしかない場合は、呼び出して破棄する必要があります。

m_pMainWindow->DestroyWindow();

MFC が自動的に反応するPostQuitMessage()ため、メイン メッセージ ループを終了し、アプリを閉じます。

さらに良いことWM_CLOSEに、メイン ウィンドウを正常に閉じるには、a を投稿する必要があります。たとえば、現在のドキュメントを保存することを決定する場合があります。ただし注意してください: 標準OnClose()ハンドラーは、ダーティ ドキュメントを保存するようにユーザーに促す場合があります。ユーザーは、このプロンプトを使用して閉じるアクションをキャンセルすることもできます (ドキュメントを保存しますか? はい、いいえ、キャンセル)。

メイン ウィンドウを破棄すると、WM_DESTROYメッセージが投稿されます。MFCPostQuitMessage(0)は、メッセージ ポンプを終了するために呼び出すことによって反応します。(実際には、MFC は呼び出しを行います。OnNcDestroy()これWM_NCDESTROYは、ウィンドウによって受信された絶対的な最後のメッセージです)

ダイアログベースのアプリ

// または、-1 をでEndDialog(-1);置き換えます。IDCANCEL

おそらくご存じのとおり、この呼び出しはダイアログを閉じます。

ダイアログ ベースのアプリのメイン ダイアログは InitInstance() で実行されることに注意してください。ダイアログを閉じると単純に終了し、そのようなプロジェクトInitInstance()では常に戻ります。FALSE

于 2011-09-27T12:20:36.427 に答える
12

単純に使用します:

PostQuitMessage(0);

プログラムはこの呼び出しからすぐに終了しないことに注意してください。ウィンドウ/プログラムは WM_QUIT メッセージを受け取り、その後プログラムが終了します。

于 2011-09-26T23:31:07.183 に答える
3

Serge - 残念ながら、あなたの答えは最善の方法ではありません。PostQuitMessage(0) を使用すると、MFC がウィンドウを破棄します。m_pMainWindow->DestroyWindow() を直接呼び出すことは避けてください。

于 2011-09-27T21:40:10.917 に答える