m_pMainWnd имеет значение NULL в CWinApp, потому что InitInstance не вызывается - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь создать простое окно, используя MFC, однако программа немедленно завершает работу, и строка вывода из Debug кажется странной:

d:\agent\_work\3\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\appcore.cpp(783) : AppMsg - Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.

После дальнейшей проверки я понимаю, что CMyFrame :: InitInstance не вызывается. У меня был некоторый опыт, связанный с MFC, потому что я использовал Win32 ++ (он же Win32xx) в Code :: Blocks. Сейчас я пробую VS Community 2019, используя официальную платформу MFC, но не могу создать пустое окно. Вот полный код:

//main.cpp
//Code taken from:
//www.tutorialspoint.com/mfc/mfc_windows_fundamentals.htm

#include <afxwin.h>
#include <iostream>

class CMyFrame : public CFrameWnd {
public:
    CMyFrame() {
        Create(NULL, _T("MFC Application Tutorial"));
    }
};

class CExample : public CWinApp {
public:
    CExample() { std::cout << "CExample Constructor\n"; }
    ~CExample() { std::cout << "CExample Destructor\n"; }

    virtual BOOL InitInstance() {
        std::cout << "CExample InitInstance\n";
        CMyFrame* Frame = new CMyFrame();
        m_pMainWnd = Frame; //<--

        Frame->ShowWindow(SW_NORMAL);
        Frame->UpdateWindow();

        return TRUE;
    }
};

CExample theApp;

int main() { return theApp.Run(); }

Выход на консоль:

CExample Constructor
CExample Destructor

D:\Visual Studio Projects\Visual C++\MFC_Project\Debug\MFC_Project.exe (process 13012) exited with code 0.

Попытка вручную вызвать InitInstance в main вызывает ошибку времени выполнения. Насколько я знаю, InitInstance должен вызываться MFC автоматически. Любая помощь приветствуется, спасибо:)

1 Ответ

1 голос
/ 19 мая 2019

Откуда взялся этот исходный код? Похоже, он не был автоматически сгенерирован Visual Studio, так как не имеет смысла.

MFC не использует main() и не вызывает run() метод CWinApp для запуска приложения MFC.

См. Эту документацию относительно метода run(), который говорит, что он запускает насос сообщений. https://docs.microsoft.com/en-us/cpp/mfc/reference/cwinapp-class?view=vs-2019#run, что означает, что ваше приложение не выполняет инициализацию, необходимую для настройки среды, чтобы насос сообщений мог действительно правильно обрабатывать сообщения.

Запуск получает и отправляет сообщения Windows, пока приложение получает сообщение WM_QUIT. Если очередь сообщений приложения В настоящее время не содержит сообщений, Выполните вызовы OnIdle для выполнения простоя обработка. Входящие сообщения отправляются участнику PreTranslateMessage функция для специальной обработки, а затем к функции Windows TranslateMessage для стандартного перевода с клавиатуры; наконец, Вызвана функция Windows DispatchMessage.

Выполнение редко переопределяется, но вы можете переопределить его, чтобы поведение.

Разрешить Visual Studio сгенерировать подходящий каркас для приложения MFC, который создаст необходимую точку входа для приложения, свяжет все необходимые библиотеки, инициализирует среду выполнения MFC и запустит насос сообщений, чтобы начать обработку сообщений. .

...