MFC初始化过程

MFC应用程序通过CWinApp派生类的全局实例theApp进行初始化。程序运行过程包括全局构造、WinMain函数、线程过程及清理。AfxGetApp和AfxGetThread全局函数在不同线程中获取相应对象。初始化涉及AFX_MODULE_STATE和AFX_MODULE_THREAD_STATE,用于记录模块和线程状态。CWinThread和CWinApp构造函数中设置相应成员,AfxWinInit函数完成Windows特定初始化。
摘要由CSDN通过智能技术生成

MFC应用程序不但具有一般的Win32程序的主要入口WinMain函数,还有一个CWinApp派生类的全局实例 theApp

Mfc程序(EXE)的程序运行过程如下:

首先是全局构造

CObject构造函数à CCmdTarget àCWinThreadàCWinAppà theApp构造函数

然后进入WinMain函数

WinMainàAfxWinMainàAfxWinInitàtheApp.InitApplicationàtheApp.InitInstance

接着执行线程过程。

theApp.Run()

最后清理

AfxWinTerm

在各种初始化函数中,反复调用了AfxGetAppAfxGetThread函数。在WinMain过程中,这两个函数实际上返回同一实例指针theApp。在其它线程中,AfxGetThread返回当前线程对象,这也就是为什么在MFC中新建线程不能使用CreateThreadbeginthread(ex),而要使用AfxBeginThread。后者会创建一个CWinThread的实例。

AfxGetAppAfxGetThread这两个全局函数是如何得知当前应用程序对象(theApp)和当前线程对象呢?在MFC中,有一个AFX_MODULE_STATE全局实例_afxBaseModuleState

(实际代码中_afxBaseModuleState_AFX_BASE_MODULE_STATE的实例,而_AFX_BASE_MODULE_STAT只是前者的一个包装,直接继承AFX_MODULE_STATE类,为了简化关系,这里把它们等同起来)。它以下划线开始,所以被认为是内部使用,不能直接操作。直接操作它的是函数AfxGetAppModuleState

AFX_MODULE_STATE的定义相当复杂,很多是为其它部件保留的与模块(EXE)相关状态参数(所以命名为MODULE_STATE)。下面只列出与初始化过程相关的部分:

   1|.  class AFX_MODULE_STATE : public CNoTrackObject

   2|.  {

   3|.  public:

   4|.  #ifdef _AFXDLL

   5|.

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值