我开始学习VC ++ / MFC。然后我创建了一个“HelloWord”程序,
我创建了一个基本的App.h/.cpp AppDlg.h/.cpp
项目,获得了两个Dialog
个基本文件。
第一个问题:我找不到程序条目。项目中没有main.cpp
。
然后我尝试找到App
和AppDlg
之间的关系,遇到了第二个问题:基于文件名,看起来AppDlg
应该是自定义的MFC {{1} } component,Dialog
假设是主事件线程。但我在两个App
文件中都得到了以下内容。它包括在一起。我认为.cpp
应该是AppDlg
的一部分。
App
这两个问题让我对项目的结构感到困惑。
为什么MFC代码看起来如此不同?出于什么目的这样做?
答案 0 :(得分:4)
你没有“主”功能的原因(引用因为它不是实际称为main
(a))是因为代码有已经写过 你了。这在框架中很常见,在您负责实际开始运行的代码之前完成一定量的设置。
事实上,即使在做创建main()
的情况下也经常出现这种情况,因为通常启动代码负责将参数转换为{ {1}}将对象移交给您的主代码(如果您看到像crt0.o
或ucrt.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需要。