为什么 VC++/MFC 没有 main 函数?

Jiu*_*Jiu 2 c++ mfc visual-c++

我开始学习 VC++/MFC。然后我创建了一个“HelloWord”程序,我App.h/.cpp AppDlg.h/.cpp通过创建一个基本的文件得到了两个基本文件Dialog项目。

第一个问题:我找不到程序入口。main.cpp项目中没有。

然后我试图找到之间的关系App,并AppDlg会见了第二个问题:基础上的文件名,貌似AppDlg应该是一个定制的MFCDialog组件,并App设是主要事件线程。但我在两个.cpp文件中都低于。它包括彼此。我认为AppDlg应该是App.

#include "App.h"
#include "AppDlg.h"
Run Code Online (Sandbox Code Playgroud)

这两个问题让我对项目的结构感到困惑。

为什么 MFC 代码看起来如此不同?这样做的目的是什么?

pax*_*blo 5

您没有“main”函数的原因(引用是因为它实际上没有调用main(a))是因为代码已经您编写好。这在框架中很常见,其中在您负责的代码实际开始运行之前完成了一定数量的设置。

事实上,这往往是即使是在您的情况的情况下创建一个main(),因为通常有启动代码这是负责做这样的事情转动参数到argc/argc对象交出你的主代码(如果你看到一个物体文件像crt0.oor ucrt.lib,这可能是 C 运行时启动代码)。

在 Windows 的早期,您编写的代码有一个WinMain()函数(a),由启动代码代替 调用main(),它通常负责注册窗口类、创建和启动消息泵,以及各种在每个应用程序中通常相同的其他东西。因此,通过将这项工作转移到某种描述的框架中,它大大减少了您需要编写的代码量。

就其工作原理而言,想想如果您链接的内容包含以下内容会发生什么:

int main(int argc, char *argv[]) {
    return bob(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)

然后你的代码不会真的需要一个main()在所有功能。它当然需要一个bob()函数,这与您发现的情况非常相似:Microsoft 在 MFC 框架中编写了他们自己的“主”函数,它设置了一些东西,以便 MFC 能够工作。

诚然,我的基于 bob 的框架并没有像 MFC 那样提供那么多的好处,但它只是一个例子,说明如何做到这一点:-)


就每种项目类型创建的每个文件的内容而言,此链接可能会有所帮助。例如,您提到的两个文件包含在:

  • <projname>.h :程序或 DLL 的主要包含文件。它包含#include其他头文件的所有全局符号和指令。它从C<projname>App类派生CWinApp并声明一个InitInstance成员函数。对于控件,C<projname>App类派生自COleControlModule.

  • <projname>dlg.cpp<projname>dlg.h:如果您选择基于对话框的应用程序,则创建。这些文件派生并实现了名为 的对话框类,C<projname>Dlg并包含用于初始化对话框和执行对话框数据交换 (DDX) 的骨架成员函数。您的 About 对话框类也放在这些文件中,而不是放在<projname>.cpp.

请注意,这些描述中没有关于消息泵的任何内容(例如)。那是因为所有繁重的工作都包含在所创建事物的类中。


(a)在 The Old New Thing 上的这篇文章中main()可以找到它的原因- 它基本上是为了确保所提供的语言与 Windows 需要的语言之间没有冲突。