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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥mfc中从InitInstance()中进入程序相关的知识,希望对你有一定的参考价值。

参考技术A 学过PE文件格式,你就明白,程序在进入WinMain之前要做很多事情,比如初始Dos头,分配函数表,初始化全局变量。之后才进入程序入口(WinMain)
MFC对WindowsAPI进行了封装。在用向导编译成的二进时代码,MFC编译器链接器把源文件编译成PE文件格式存储在磁盘上。
程序执行的时候,从PE文件头开始执行,在进入Winmain函数之前,进行一系列的必备的初始化。
MFC对这一系列的过程进行了封装。提供给编程人员的第一个裸露程序入口就是CWinApp的InitInstance(),其实程序的入口依然是WinMain()函数。
大家都知道,每个程序都有拥有一个进程,每个进程至少有一个线程就是主线程。CWinThread类是MFC用来封装线程的,这个主线程就是在WinMain函数中创建的,包括UI线程和工作者线程。因此每个MFC程序至少使用一个CWinThread派生类。被MFC程序员熟知的CWinApp应用类就从这里派生。
InitInstance是CWinThread的一个虚函数,InitInstance就是“初始化实例”的意思,可见,它是在实例创建时首先被调用的。应用程序总要重载这个虚函数,进行系统设置,创建运行环境。例如,主窗口一定要在InitInstance()中创建,因为该函数退出后就进入该线程的消息循环。
MFC执行流程。
_tWinMain(WinMain的别名,用define替换的)-》AfxWinMain->初始化线程,调用InitInstance初始化窗口,调用Run函数进入消息循环。
希望对你有用。
参考技术B 谁说mfc中从InitInstance()中进入程序?
你应该能找到mfc程序中都有一个全局变量theApp,最先执行的是这个theApp的构造函数。
至于怎么进入的InitInstance(),是因为mfc的这个InitInstance()是一个虚函数,mfc程序有一个_tWinMain,就相当于C程序的main,它又调用了AfxWinMain,在AfxWinMain中调用了InitInstance(),由于InitInstance()是虚函数,对于InitInstance()的调用就调用到你的程序中的InitInstance()了
参考技术C 哈,小伙子精神不错啊...
是这样的.....
mfc的基于于对话框的应用程序与文档的应用程序用的不是同一个run.
你上面的理解是文档类型的.
到于对话框,请看ctestapp::initinstance()中的代码,其中有以下几句:
ctestdlg
dlg;
m_pmainwnd
=
&dlg;
int
nresponse
=
dlg.domodal();
大致是这样吧.这个domodal内部有为模态对话框重建一个消息循环,模态对话框用得就是这样消息循环.你可以去百度下大牛们对模态对话框消息循环的分析.
当对话框退出的时候,initintance总是会返回false,而这在winmain里的有大致这样的代码:
if(!initinstance())//函数不是这样直接写,但最终是调用这个函数

xxxxxxxxxx
goto
failture;

这个goto语句直接会将cwinapp::run直接跳过.从而直接结束winmain.
明白?给点分吧,打字不容易啊,兄弟

(转)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中从InitInstance()中进入程序的主要内容,如果未能解决你的问题,请参考以下文章

(转)InitInstance函数的理解

在MFC里面添加个自定义控件,为啥程序自动退出,不显示窗口等待用户操作了?

VC中MFC从哪里开始运行,MFC怎么调试

VC中MFC从哪里开始运行,MFC怎么调试,很急呀

如何将入口点更改为 MFC 应用程序的 _tmain()

如何在 JSP 页面中从 Java 类中设置 hashmap 的值以便在控制器中进一步使用