【问题标题】:In MFC why do I need to create a global instance of CWinApp?在 MFC 中,为什么我需要创建 CWinApp 的全局实例?
【发布时间】:2012-05-14 16:58:17
【问题描述】:

为什么我的派生 CWinApp 的构造函数应该在 main 函数启动之前被调用?
为什么不能是这样的:

int WinMain()
{
   CMainFrame* pMainFrame = new CMainFrame;
   // etc ...
}

我正在寻找导致这种行为的技术原因。
编辑:
为了更清楚 - 如果我使用没有 MFC 的 win32 API,主窗口是在 WinMain 中创建的,那么有什么区别?

【问题讨论】:

  • 大概是CWinApp 的构造函数在main 函数运行之前 运行。但我实际上并不确定;我从来没有尝试过这样做,看看它是否有效。你有吗?
  • @CodyGray 是的,我试过了。应用程序在 AfxWinMain 中崩溃
  • 啊,是的,正如弗雷德里克的回答所预测的那样。 CWinApp 的构造函数正在设置一些状态变量的值,这是 AfxWinMain 所期望的。

标签: c++ windows user-interface mfc


【解决方案1】:

基本上,这是因为 MFC 设计者决定在库本身中提供应用程序入口点(WinMain(),而不是 main()),因此用户不必编写一个。

然后应用程序的初始化和终止逻辑被重新定位到用户提供的CWinApp 派生单例实例的InitInstance()ExitInstance() 方法。此实例必须在 WinMain() 运行之前存在,因为它调用上述方法(和 Run() 进入消息循环)并使用它来存储状态(就像它接收的 nCmdShow 参数一样)。

在全局范围内定义 CWinApp 派生的实例是确保在 WinMain() 运行时它确实存在的简单方法。

This article 提供有关 MFC 应用程序启动时幕后情况的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2014-04-08
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多