为什么VC ++ / MFC没有主要功能?

时间:2018-04-03 01:13:05

标签: c++ visual-c++ mfc

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

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

然后我尝试找到AppAppDlg之间的关系,遇到了第二个问题:基于文件名,看起来AppDlg应该是自定义的MFC {{1} } component,Dialog假设是主事件线程。但我在两个App文件中都得到了以下内容。它包括在一起。我认为.cpp应该是AppDlg的一部分。

App

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

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

1 个答案:

答案 0 :(得分:4)

你没有“主”功能的原因(引用因为它不是实际称为main (a))是因为代码有已经写过 你了。这在框架中很常见,在您负责实际开始运行的代码之前完成一定量的设置。

事实上,即使在创建main()的情况下也经常出现这种情况,因为通常启动代码负责将参数转换为{ {1}}将对象移交给您的主代码(如果您看到像crt0.oucrt.lib这样的对象文件,则可能是C运行时启动代码。)

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

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

main()

然后你的代码根本不会需要一个int main(int argc, char *argv[]) { return bob(argc, argv); } 函数。 当然需要一个main()函数,这与你发现的情况非常相似:微软已经在MFC框架中编写了自己的“主要”函数来设置事物,以便MFC将会工作。

不可否认,我的基于bob的框架并没有提供与MFC一样多的好处,但它只是一个如何做的例子: - )

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

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

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

请注意,这些描述中有关于消息泵的 nothing (例如)。这是因为所有繁重的工作都包含在 base 类中,用于创建的东西。

(a)this article on The Old New Thing中可以找到* <projname>.cpp不是main()的原因 - 这基本上是为了确保语言提供的内容和内容之间不会发生冲突Windows需要。