- 11
- 0
- 约5.01千字
- 约 4页
- 2021-10-19 发布于福建
- 举报
1、MFC程序的启动过程
MFC的封装机制隐藏了函数的执行过程, 这使 MFC程序不如传统的 Win32 程序具有清晰的运
行流程。
但是作为 Windows 程序, MFC程序也有 WinMain 。
下面的启动过程分析基于单文档应用程序 SinDocEx:
2、MFC程序的挂起状态
Run——程序挂起
Run函数通过消息循环,检查消息队列中是否有需要处理的消息。如果有消息需
要处理,则 Run就调度它;如果没有任何消息需要处理,则 Run调用 OnIdle ,
以便执行用户或框架需要完成的空闲时间处理。 如果没有任何消息, 也没有任何
可执行的空闲处理,则应用程序一直等待消息产生,应用也就被挂起。
空闲处理
MFC程序的空闲处理, 及 Run 中的 OnIdle 。MFC实现了这样一个 Idle 处理机制:
在没有消息可以处理时,进行 Idle 处理。
3、MFC程序的终止
一个 MFC应用程序的生命周期
(一)程序的进入点
MFC 作为 Win32 API 的一种封装,它的程序进入点自然是 WinMain 。但是,这个
WinMain 也被封装起来,用户是看不到的,只是在编译器进行连接时会被自动连接。
下面我们就来寻找一下 MFC程序被隐藏了的 WinMain 。搜索 MFC的源文件, 可以发
现 MFC的 WinMain 定义在 appmodul.cpp 中。 此文件可以在 VC 的 MFC src 文件夹中找到
extern C int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanc
e, __in LPTSTR lpCmdLine, int nCmdShow) { // call share
d/exported WinMain return AfxWinMain(hInstance, hPrevInstance, lpCmdLi
ne, nCmdShow); }
这里的名字虽然是 _tWinMain 但是我们使用“转到定义”菜单项跳转, 会发现实际
上这是一个宏:
#define _tWinMain wWinMain
作为测试我们在 VS 中新建一个 SDI MFC 工程,起名为 Test ,VC会自动生成五个
类
CAboutDlgCMainFrameCTestAppCTestDocCTestView
在 appmodul.cpp 中的 WinMain 中加入一个断点,然后运行程序。这时我们会发现
程序在 _tWinMain 的断点停住,说明 _tWinMain 正是 MFC程序包裹之下的 WinMain
( 二 ) WinMain 的工作与生命周期
继续先前追溯,我们注意到,在 Test.cpp 中定义有一个全局的对象
CTestApptheApp; 而每一个 MFC应用程序都有这样唯一的一个从 CWinApp继承来的应用程序
对象。由于这个对象是全局的,将在 WinMain 进入之前进行构造和初始化。
我们继续看看 _tWinMain 都进行了什么工作。 在_tWinMain 中只调用了 AfxWinMain
函数,它 定义在 WINMAIN.CPP中,部分代码如下:
CWinThread* pThread = AfxGetThread (); CWinApp* pApp = AfxGe
tApp ();
/*pThread 和 pApp 实际是相同的,因为 CWinApp继承自 CWinThread,
它们最终都指向
您可能关注的文档
最近下载
- 明代宗教信仰与思想控制.docx VIP
- 江苏省南通市2024-2025学年高二上学期期末学业质量监测语文试卷(含答案).pdf VIP
- 国就有成人演出的电影了?想看就要冒生命危险.pdf VIP
- 综合素质练习题及答案.doc VIP
- 2020-2021学年北京高三化学二轮复习 反应原理型简答题(突破二卷)(word版 含答案).docx VIP
- 电力拖动控制线路安装与检修(白银矿冶职业技术学院)知到智慧树答案.docx VIP
- 煤炭巷道掘砌工(高级工)资格考试题库(全真题库).docx VIP
- 影像叙事中情感共鸣生成机制.docx VIP
- 同轴二级圆柱齿轮减速器的设计(硬齿面).doc VIP
- 基于GPU多线程多通道图像高速重构方法、设备及介质.pdf VIP
原创力文档

文档评论(0)