关于c ++:以编程方式退出MFC应用程序的正确方法是什么?

What is the correct way to programmatically quit an MFC application?

使用Windows MFC C ++。 我有一个第三方应用程序,该应用程序在CWinApp派生类中调用用户定义的方法。 在InitInstance()之后调用此方法。 如果此方法有错误,则在try / catch块中引发并捕获了异常,我想从catch块退出应用程序。 规范和正确的退出方式是什么?

更新:

我相信Serge是正确的,在InitInstance()中返回false是退出应用程序的正确方法。 但是,现在假设我想从CDialog派生类的OnInitDialog()处理函数中退出,执行此操作的正确方法是什么。

更新2

对我来说,我发现从非模态CDialog派生类中调用PostMessage(WM_CLOSE)是最好的方法。 我尝试过的所有其他退出方法都会在某些情况下引发某些异常或其他情况。

这是我的用法示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}


在InitInstance()中

仍在InitInstance()中时退出应用程序:只需从InitInstance()返回FALSE

在主消息循环中

但是,如果您已经处于消息循环中,则这是另一个故事:关闭应用程序的标准方法是退出消息循环:

顾名思义,PostQuitMessage(0)发布WM_QUIT消息。消息循环通过退出循环并关闭程序来作出反应。

但是,您不应该简单地这样做:您应该关闭应用程序中打开的窗口。
假设您只有主窗口,则应通过调用来销毁它

1
m_pMainWindow->DestroyWindow();

MFC将通过PostQuitMessage()为您做出反应,因此退出主消息循环并关闭您的应用程序。

更好的是,您应该发布WM_CLOSE以使主窗口正常关闭。例如,它可能决定保存当前文档。但是要当心:标准的OnClose()处理程序可能会提示用户保存脏文档。用户甚至可以使用此提示取消关闭操作(保存文档?是,否,取消)。

销毁主窗口将向其中发布WM_DESTROY消息。 MFC通过调用PostQuitMessage(0)退出退出消息泵。 (实际上,由于WM_NCDESTROY是窗口接收到的绝对最后一条消息,因此MFC在OnNcDestroy()中进行调用)

基于对话框的应用

调用EndDialog(-1); //或用IDCANCEL代替-1

您可能知道,此调用将关闭对话框。

请注意,基于对话框的应用程序的主对话框在InitInstance()中执行。关闭对话框将仅退出InitInstance(),在此类项目中,该值始终返回FALSE


只需使用:

1
PostQuitMessage(0);

请记住,您的程序不会立即从此调用中退出,窗口/程序将收到WM_QUIT消息,然后您的程序将退出。


Serge-不幸的是,您的答案并不是最好的方法。 PostQuitMessage(0)是解决方法,MFC会为您破坏窗户。您应该避免直接调用m_pMainWindow-> DestroyWindow()。