在CWinApp中m_pMainWnd为NULL,因为未调用InitInstance

时间:2019-05-18 19:44:29

标签: c++ mfc visual-studio-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相关的经验,因为我在Code :: Blocks中使用了Win32 ++(又名Win32xx)。现在,我在使用官方MFC框架时正在尝试VS Community 2019,但是我无法创建空白窗口。这是完整的代码:

//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.

尝试在main中手动调用InitInstance会触发运行时错误。据我所知,InitInstance应该由MFC自动调用。 任何帮助表示赞赏,谢谢:)

1 个答案:

答案 0 :(得分:1)

此源代码来自哪里?它似乎不是由Visual Studio自动生成的,因为它没有意义。

MFC不使用main(),也不调用run()的{​​{1}}方法来启动MFC应用程序。

有关CWinApp方法的信息,请参阅此文档,该方法表示它将启动消息泵。 https://docs.microsoft.com/en-us/cpp/mfc/reference/cwinapp-class?view=vs-2019#run表示您的应用程序没有进行设置环境所需的任何初始化,因此消息泵实际上可以正确处理消息。

  

Run获取并调度Windows消息,直到应用程序   收到WM_QUIT消息。如果应用程序的消息队列   当前不包含任何消息,运行调用OnIdle以执行空闲时间   处理。传入的消息转到PreTranslateMessage成员   功能进行特殊处理,然后转到Windows功能   TranslateMessage用于标准键盘翻译;最后,   调用DispatchMessage Windows函数。

     

运行很少被覆盖,但是您可以覆盖它以提供特殊的   行为。

允许Visual Studio为MFC应用程序生成适当的框架,该框架将为该应用程序创建必要的入口点,链接所有适当的库,初始化MFC运行时环境,并启动消息泵以开始处理消息