Приложение MFC закрывается при запуске

#c #visual-c #mfc

#c #visual-c #mfc

Вопрос:

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

Вот код до сих пор:

 CWinApp theApp;

using namespace std;

int main(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    theApp.InitApplication();
    theApp.InitInstance();
    theApp.Run();

    AfxWinTerm();

    if (hModule != NULL)
    {
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            _tprintf(_T("Fatal Error: MFC initialization failedn"));
            nRetCode = 1;

        }
        else
        {
            MyDialog *mdlg = new MyDialog();
            mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
            mdlg->ShowWindow( true );

        }
    }
    else
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: GetModuleHandle failedn"));
        nRetCode = 1;
    }

    return nRetCode;
}
  

Должно быть что-то простое, что я могу сделать, чтобы программа не завершалась, просто не уверен, как?

Ответ №1:

Вместо вызова:

 mdlg->ShowWindow( true );
  

вы должны сделать:

 mdlg->DoModal();
  

Кроме того, я не думаю, что вам нужно Create . Если вы хотите остаться с немодальным диалогом, вам следует создать цикл сообщений перед возвратом из main — что-то вроде here http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows

Комментарии:

1. Смотрел на это, но мой класс (наследуется от CDialog) не имеет члена «DoModel»?

2. Если это MFC CDialog, то он, безусловно, имеет DoModal (по наследству): msdn.microsoft.com/pl-pl/library/619z63f5.aspx

3. Да, я был идиотом, я получаю ошибку утверждения отладки: // не удается вызвать DoModal в диалоговом окне, уже созданном как немодальное УТВЕРЖДЕНИЕ (m_hWnd == NULL);

4. Избавился от создания, но не удалось выполнить утверждение перекачки сообщения: TRACE(traceAppMsg, 0, «Ошибка: CWinThread::PumpMessage вызывается, когда не разрешено. n»); ASSERT(FALSE);

5. Наконец-то понял; использовал ссылку на Википедию и вызвал WinMain после выполнения Create() и ShowWindow();

Ответ №2:

Насколько я вижу, вы создали консольное приложение Win32 и пытаетесь добавить к нему графический интерфейс? Вы должны делать это только в том случае, если вам действительно нужна консоль. Если нет, то лучше создайте новый проект, выберите шаблон приложения MFC и выберите приложение на основе диалога. Мастер создаст все, что вам нужно.

Кстати, ваш

 MyDialog *mdlg = new MyDialog();
mdlg->Create( IDD_MDLG, theApp.m_pMainWnd);
mdlg->ShowWindow( true );
  

лучше было бы:

 MyDialog mdlg;
mdlg.DoModal();
  

new В вашем случае нет необходимости, поэтому просто выделите объект в стеке. И DoModal делает то, что вы хотите.

В моем консольном приложении Win32 с поддержкой MFC я смог показать диалоговое окно. Но в моем сгенерированном мастером коде этих строк не было, поэтому, возможно, вам следует их удалить:

 theApp.InitApplication();
theApp.InitInstance();
theApp.Run();

AfxWinTerm();
  

Комментарии:

1. Да, это то, к чему я стремился, есть идеи, почему это может возникнуть: TRACE(traceAppMsg, 0, «Ошибка: CWinThread::PumpMessage вызывается, когда не разрешено. n»); ASSERT(FALSE); ?

2. @user3047190 Когда приходит это сообщение? Вы воссоздали проект или это все еще консольное приложение? Когда возникает ошибка?

3. Спасибо, решил это, используя вики-ссылку в принятом ответе, я знаю, что проблема была как-то связана с перекачкой сообщений, поэтому вики-ссылка позволила мне создать цикл сообщений для передачи сообщений между диалоговыми кнопками и программой — и, следовательно, программа оставалась открытой

4. @user3047190 Я обновил свой ответ. Нет необходимости создавать цикл сообщений!