Подтвердить что ты не робот

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

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

UPDATE:

Серж Я считаю правильным, что в 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;
}
4b9b3361

Ответ 1

В InitInstance()

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

В основной строке сообщения

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

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

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

m_pMainWindow->DestroyWindow();

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

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

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

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

Вызов EndDialog(-1);//Или замените -1 на IDCANCEL, любой

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

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

Ответ 2

Просто используйте:

PostQuitMessage(0);

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

Ответ 3

Серж - ваш ответ, к сожалению, не лучший способ сделать это. PostQuitMessage (0) - это способ пойти, и MFC уничтожит окна для вас. Вам не следует напрямую обращаться к m_pMainWindow- > DestroyWindow().