(菜鸟)了解一下MFC程序如何进入WinMain的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(菜鸟)了解一下MFC程序如何进入WinMain的相关的知识,希望对你有一定的参考价值。

我看孙鑫第三节课视频,执行流程先是建全局对象theApp,然后CTestApp构造函数,在CWinApp构造函数,然后就很奇怪的到WinMain了,怎么进去的还真不知道!
我想问执行WinMain前是不是有代码去调用它呢

WinMain()跟main()函数一样,是用run time自己调用的。
C++程序启动的顺序是这样的:

1. 构造全局对象。在MFC程序里,theApp就是全局对象。因为theApp的类型是CTestApp,所以CTestApp的构造函数会被调用

2. 调用main()或者WinMain()。如果是MFC程序,会默认提供一个WinMain()函数的实现,你不需要自己另外写。如果你自己另外写一个WinMain(),会引起Link Error。

以上两步都是C++ Run Time做的,不需要你自己写什么代码。你可以认为C++就是这么规定的。

补充:
是,有代码去调用它。但是这些代码不需要你来写,对你来讲也没有什么意义。这些代码属于runtime
参考技术A

是由 联接器自动加入的  《深入浅出MFC》电子书截图

PS:请看认真学习 《深入浅出MFC》 经典著作 我可以给你发个电子版的

(转)InitInstance函数的理解

  BOOL InitInstance() 为什么说它是程序的进入点?还有,那个 WinMain 函数又有什么作用,这两个函数之间有什么关系吗?

  BOOL InitInstance()是MFC的CWinApp类的成员函数,而WinMain才是真正的入口点,但是MFC不允许程序中有WinMain这个函数,因为MFC自己编写了WinMain函数,如果程序中再定义就重复定义了,而 MFC编写的WinMain函数则调用了CWinApp::InitInstance函数,所以InitInstance看起来似乎就是MFC程序的入口点。


 InitInstance是虚函数,继承类必须提供其实现代码。完成整个消息链的启动。

  在CWinApp这个类中除了有一般类都有的构造函数,一个重要的成员函数就是InitInstance,我们知道,在WINDOWS环境下面可以运行同一程序的多个实例(非模态),函数InitInstance的作用就是:在生成一个新的实例的时候,完成一些初始化工作

  Windows允许在同一时刻运行程序的几份拷贝。在概念上,应用程序的 初始化 可以被分为两个部分(由MFC中CWinApp的两个虚函数负责完成):

  1、一次性的应用程序初始化工作,这些在应用程序第一次运行时完成(InitApplication:“每一个程序只做一次);

  2、实例的初始化工作,每次运行程序的一个拷贝时都会执行这些操作,包括第一次运行时(InitInstance:“每一个例程都得做一次)。框架中WinMain实现调用这个函数,重载InitInstance以初始化在Windows下运行的应用程序的每个新实例(通常,重载InitInstance以构造主窗口对象并设置CWinThread::m_pMainWnd数据成员,使其指向这个窗口)。 

  注: “每一个程序”指的是进程的概念,“每一个例程”指的是线程的概念。InitInstance是每一个线程都具有的函数,只不过很多情况下,你自己开的线程没有重载该函数。其实在基于CWinApp的程序中InitApplication和InitInstance都只执行一次。InitApplication是MFC的较老的入口函数,现在一般不重载InitApplication而直接重载InitInstance。不过如果使用CWinThread或者AfxBeginThread创建线程,新的线程会执行新建CWinThread对象的InitInsatnce函数一次。不过这和CWinApp没有关系。

 

以上是关于(菜鸟)了解一下MFC程序如何进入WinMain的的主要内容,如果未能解决你的问题,请参考以下文章

为啥mfc中从InitInstance()中进入程序

MFC的执行过程分析

MFC 程序入口和执行流程

MFC程序执行过程剖析(转)

(转)InitInstance函数的理解

WinMain和MFC的差别