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

3
我开始学习VC++ / MFC。然后我创建了一个“HelloWord”程序,通过创建基本的Dialog项目,我获得了两个App.h/.cpp AppDlg.h/.cpp基本文件。
第一个问题:我找不到程序入口。项目中没有main.cpp
然后我试图找到AppAppDlg之间的关系,遇到了第二个问题:根据文件名,AppDlg应该是自定义的MFCDialog组件,而App应该是主事件线程。但是在两个.cpp文件中都有以下内容,它们互相包含。我认为AppDlg应该是App的一部分。
#include "App.h"
#include "AppDlg.h"

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

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

1个回答

6
你没有"main"函数(引号是因为它实际上不叫做main(a))的原因是代码已经被写好了。这在框架中非常常见,在实际运行你负责的代码之前,会进行一定量的设置。
事实上,即使在创建main()的情况下,通常也是如此,因为通常有启动代码负责将参数转换为argc/argv对象并传递给主要代码(如果你看到像crt0.oucrt.lib这样的目标文件,那可能是C运行时启动代码)。
在Windows早期,你编写的代码有一个WinMain()函数(a),它由启动代码调用,而不是main(),通常负责注册窗口类、创建和启动消息泵,以及所有应用程序通常相同的其他任务。因此,通过将这项工作移到某种框架中,大大减少了需要编写的代码量。
就其工作原理而言,可以想象一下,如果你链接的东西包含以下内容会发生什么:
int main(int argc, char *argv[]) {
    return bob(argc, argv);
}

然后,你的代码实际上根本不需要一个main()函数。当然,它需要一个bob()函数,这与你发现的情况非常相似:微软在MFC框架中编写了自己的"main"函数,以设置使MFC正常工作的内容。
诚然,我基于bob的框架提供的好处不如MFC多,但它只是一个示例,说明如何完成 :-)

关于每个项目类型创建的每个文件中包含什么,此链接 可能会有所帮助。例如,您提到的两个文件包括:

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

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

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


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


1
吹毛求疵一下:我觉得你用的是WinMain,甚至比Win32还要早。 - MSalters
1
MSalters是正确的。WinMain在16位Windows中也是用户提供的入口点,当时第二个参数(hPrevInstance)实际上被使用。 - IInspectable
两个好的观点,已经进行了研究和调整答案以适应。 - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接