我是靠谱客的博主 天真牛排,最近开发中收集的这篇文章主要介绍mfc程序执行顺序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MFC的程序和C语言的程序,从执行原理上说,是完全一致的。当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数(实际是由插入到可执行文件中的启动代码调用的)。WinMain是Windows程序的入口点函数,与DOS程序的入口点函数main的作用相同,当WinMain函数结束或返回时,Windows应用程序结束。

Win32应用程序有一条很明确的主线:首先进入WinMain函数,然后设计窗口类、注册窗口类、产生窗口、注册窗口、显示窗口、更新窗口,最后进入消息循环,将消息路由到窗口过程函数中去处理。

WinMain函数是程序的入口函数。也就是说,程序运行时首先应该调用的是WinMain函数,那么这里为什么程序会首先调用CTestApp类的构造函数呢?看一下CTestApp的源文件,可以发现程序中定义了一个CTestApp类型的全局对象:theApp。代码如下。

// The one and only CTestApp object

CTestApp theApp;

提示:MFC程序的全局变量都放置在ClassView标签页的Globals分支下,展开该分支即可看到程序当前所有的全局变量。双击某个全局变量,即可定位到该变量的定义处。应该明白了先前穿件的Test程序的运行顺序,也就是为什么全局变量的theApp的构造函数会在WinMain函数之前执行了。

那么为什么要定义一个全局对象theApp,让它在WinMain函数之前执行呢?该对象的作用是什么?

理论:无论是全局变量,还是全局对象,程序在运行时,在加载main函数之前,就已经为全局变量或全局对象分配了内存空间。对一个全局对象来说,此时就会调用该对象的构造函数,构造该对象,并进行初始化。
具体原因是:应用程序的实例是由实例句柄(WinMain函数的参数hInstance)来标识的。而对MFC程序来说,通过产生一个类的对象(CWinApp的对象)来唯一标识应用程序的实例。每一个MFC程序有且仅有一个从应用程序类(CWinApp)派生的类。每一个MFC程序实例有且仅有一个该派生类的实例对象,也就是theApp全局对象。该对象表示了应用程序本身。当一个子类在构造之前会先调用其父类的构造函数。因此,theApp对象的构造函数CTestApp在调用之前,会调用其父类CWinApp的构造函数,从而就把我们程序自己创建的类与Miscrosoft提供的基类关联起来了。CWinApp的构造函数完成程序运行时的一些初始化工作。

我们在这个全局对象定义处设置一个断点,然后调试运行Test程序,将发现程序执行的顺序依次是:

(1)theApp全局对象定义处;

(2)TestApp构造函数;

(3)然后才是WinMain函数。



C中的main函数就相当于MFC中的WinMain函数。

感兴趣的可以利用VC的断点设置自己跟踪下面讲述的各个函数,就明白它的执行顺序了。

一、C语言程序执行步骤

在C语言中,大约的步骤如下:

1, 全局变量内存分配例子如下:

#include <iostream.h>

int a=88;

main(){

cout<<a<<endl;

}

如果我们在main前设置断点,我们就会发现,在进入main之前,a就已经存在了。也就是说像a这样的全局变量在进入main函数前已经创建,并初始化。

2. 进入main函数

二、MFC程序的运行步骤(主要是初始化)

打开一个MFC APPWizard(exe)工程,跟踪其执行步骤,可以发现,是以下顺序:

1)CXXApp中的全局变量定义(在WinMain()函数之前定义的全局变量)

CXXApp theApp;

2)调用CXXApp

最后

以上就是天真牛排为你收集整理的mfc程序执行顺序的全部内容,希望文章能够帮你解决mfc程序执行顺序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部