Каков правильный способ программного выхода из приложения MFC?

использование windows MFC c++. У меня есть стороннее приложение, которое вызывает пользовательский метод в моем производном классе CWinApp. Этот метод вызывается после InitInstance (). Если в этом методе есть ошибка, такая, что исключение выбрасывается и ловится в блоке try/catch, я хотел бы выйти из приложения из блока catch. Каков канонический и правильный способ бросить курить?

обновление:

Serge я считаю правильным, что в initinstance () возвращается false-это правильный способ выйти из приложения. Однако теперь предположим, что я хочу выйти из обработчика OnInitDialog() производного класса CDialog, каков правильный способ сделать это.

обновление 2

для меня я нашел вызов PostMessage (WM_CLOSE) лучшим способом из моего немодального производного класса CDialog. Все другие методы ухода, которые я пробовал, в некоторых случаях вызывали бы исключение.

вот пример того, как я использую это:

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;
}

3 ответов


В InitInstance ()

выход из приложения, пока вы все еще в InitInstance(): просто вернуть FALSE С InitInstance().

в главном цикле обработки сообщений

это еще одна история, хотя, если вы уже находитесь в цикле сообщений: стандартный способ закрыть приложение, чтобы выйти из цикла сообщений:

PostQuitMessage(0), как следует из названия, сообщения a WM_QUIT сообщение. Цикл сообщений реагирует, выходя из цикла и закрывая программа.

но вы не должны просто делать это: вы должны закрыть открытые окна в своем приложении. Если у вас есть только главное окно, вы должны уничтожить его, назвав

m_pMainWindow->DestroyWindow();

MFC будет реагировать PostQuitMessage() для вас, следовательно, выйти из основного цикла сообщений и закрыть приложение.

еще лучше, вы должны опубликовать WM_CLOSE позволить вашему главному окну закрыть грациозно. Например, он может принять решение сохранить текущий документ. Остерегайтесь, хотя: стандарт OnClose() обработчик может предложить пользователю сохранить грязные документы. Пользователь может даже отменить действие закрытия с помощью этого приглашения (сохранить документ? Да, Нет, Отменить).

уничтожение главного окна опубликует WM_DESTROY сообщение. MFC реагирует вызовом PostQuitMessage(0) для выхода из насоса сообщений. (На самом деле, MFC делает вызов OnNcDestroy() С WM_NCDESTROY что является абсолютным последнее сообщение, полученное окне)

диалоговое приложение

вызов EndDialog(-1); // или заменить -1 by IDCANCEL, ни

этот вызов, как вы, вероятно, знаете, закроет диалог.

обратите внимание, что основной диалог диалогового приложения выполняется в InitInstance (). Закрытие диалога будет просто выйти InitInstance(), которая всегда возвращает FALSE в таких проектах.


просто использовать:

PostQuitMessage(0);

имейте в виду, что ваша программа не выйдет мгновенно из этого вызова, окно/программа получит сообщение WM_QUIT, а затем ваша программа выйдет.


Serge - ваш ответ, К сожалению, не лучший способ сделать это. PostQuitMessage(0) - это путь и MFC уничтожит окна для вас. Вы должны избегать вызова m_pmainwindow - >DestroyWindow() напрямую.