windows的运行机制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC程序的启动 程序的启动
AFX内部初始化操作 3、AfxWinInit——AFX内部初始化操作 AfxWinInit AFX AfxWinInit是继CWinApp构造函数之后的第一个操作 AfxWinInit是继CWinApp构造函数之后的第一个操作 是继CWinApp ,主要做的是AFX内部初始化操作 主要做的是AFX内部初始化操作 AFX 4、执行CWinApp::InitApplication 执行CWinApp::InitApplication AfxWinInit之后的操作是pApp->InitApplication AfxWinInit之后的操作是pApp之后的操作是pApp 相当于调用: 而pApp指向CWinGreetApp对象,所以 相当于调用: pApp指向CWinGreetApp对象, 指向CWinGreetApp对象 CWinGreetApp::InitApplication(); 而CWinGreetApp继承自CWinApp, InitApplication CWinGreetApp继承自CWinApp, 继承自 又是CWinApp的一个虚拟函数,我们并没有改写它( 又是CWinApp的一个虚拟函数,我们并没有改写它(大 CWinApp的一个虚拟函数 部分情况下不需改写它) 部分情况下不需改写它),所以上述操作相当于调用 MFC完成内部管理 CWinApp::InitApplication(); MFC完成内部管理
MFC程序的启动 程序的启动 剖析ProcessShellCommand(cmdInfo) 函数 剖析
(1) DOCTEMPL.CPP的264行 ) 的 行
CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
在这个函数内会通过new算子创建框架类 算子创建框架类CMainFrame。 在这个函数内会通过 算子创建框架类 。 先调用基类CFrameWnd的构造函数,再调用CMainFrame的构 的构造函数,再调用 先调用基类 的构造函数 的构 造函数,接着调用状态条类 造函数,接着调用状态条类CStatusBar的构造函数和工具条类 的构造函数和工具条类 CToolBar的构造函数。 的构造函数。 的构造函数
SDK程序的运行过程 程序的运行过程
进入WinMain后 首先设计窗口类,注册窗口、 进入WinMain后,首先设计窗口类,注册窗口、 WinMain 创建窗口、然后显示窗口、更新窗口、 创建窗口、然后显示窗口、更新窗口、最后进 入消息循环, 入消息循环,将消息路由到我们的窗口过程函 数中去处理 。
MFC程序的启动与死亡顺序 程序的启动与死亡顺序
文档类: 文档类:负责数据 结构与文件操作
应 用
文档模板类: 文档模板类:直接使
框架类:主窗口 框架类 主窗口
状态栏和工具栏直
类
用,管理文档、视图 管理文档、 和框架 接使用
视图类: 视图类:负责数据 的显示与打印 单文档应用程序WinGreet中使用到的类 中使用到的类 单文档应用程序
这个函数进一步调用AfxRegisterClass(pWndCls);来完成窗口 来完成窗口 这个函数进一步调用 来完成 类的注册。 类的注册。 在MFC中,预先给我们定义好了缺省的窗口类,我们只需调用 中 预先给我们定义好了缺省的窗口类, AfxEndDeferRegisterClass去注册就可以。它会根据我们的应 去注册就可以。 去注册就可以 用程序选择不同的窗口去注册。 用程序选择不同的窗口去注册。
MFC程序的启动 程序的启动
b) 在Create中会调用 中会调用CreateWindowEx, 中会调用 , 于是触发WM_CREATE消息。 消息。 于是触发 消息 由于在CMainFrame中拦截了 中拦截了WM_CREATE消息 由于在 中拦截了 消息 所以WM_CREATE消息产生之 (利用ON_WM_CREATE宏),所以 利用 宏),所以 消息产生之 际会调用CMainFrame类的 际会调用 类的OnCreate函数。在此函数内先调用 函数。 类的 函数 基类CFrameWnd的OnCreate函数,然后为主窗口挂上工具条 的 函数, 基类 函数 和状态条。 和状态条。 而在CFrameWnd::OnCreate中会创建视图(CView)窗口 中会创建视图( 而在 中会创建视图 )
MFC程序的启动 程序的启动
DOCTEMPL.CPP的277行 的 行 (2)pFrame->LoadFrame(m_nIDResource, ) WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context)) 在这个函数内完成窗口类的注册,产生主窗口并加挂菜单等诸元 在这个函数内完成窗口类的注册, 素,并指定窗口标题、文件标题、文件扩展名等。 并指定窗口标题、文件标题、文件扩展名等。 该函数内部将依次调用AfxDeferRegisterClass,Create,后者 , 该函数内部将依次调用 , 将调用CreateWindowEx,于是触发WM_CREATE消息。 将调用 ,于是触发 消息。 消息
MFC程序的启动 程序的启动
5、执行CWinApp::InitInstance 、执行 函数之后, 继InitApplication函数之后, 函数之后 AfxWinMain调用 调用pApp->InitInstance。 调用 。 当程序调用: 当程序调用:pApp->InitInstance(); 相当于调用: 相当于调用:CWinGreetApp::InitInstance(); 而 CWinGreetApp 继 承 自 CWinApp, 而 InitInstance 又是CWinApp的一个虚拟函数 。 由于我们改写了它 的一个虚拟函数。 又是 的一个虚拟函数 所以上述操作就是调用我们自己(CWinGreetApp) , 所以上述操作就是调用我们自己 的这个InitInstance函数。 函数。 的这个 函数
SDK编程时, 编程时 在SDK编程时,是通过一个应用程序的实例号来标示一个应用程序 的。在基于MFC应用程序中,是通过产生一个应用类的对象来唯一 在基于MFC应用程序中, MFC应用程序中 标识我们的整个应用程序。 标识我们的整个应用程序。
MFC程序的启动 程序的启动
2、WinMain登场 、 登场 编程序时, 函数, 用SDK编程序时,程序的入口点是 编程序时 程序的入口点是WinMain函数, 函数 而在MFC程序里我们并没有看到 程序里我们并没有看到WinMain函数, 原 函数, 而在 程序里我们并没有看到 函数 来她是被隐藏在MFC代码里面了。当theApp配置完 代码里面了。 来她是被隐藏在 代码里面了 配置完 成后, 登场。 成后,WinMain登场。MFC早已准备好并由链接器直 登场 早已准备好并由链接器直 接加到应用程序代码中了,原来她在appmodul.cpp 接加到应用程序代码中了,原来她在 里面。 里面。
MFC程序的启动 程序的启动
AfxWinMainLeabharlann Baidu数定义于 函数定义于WINMAIN.CPP第21行 函数定义于 第 行
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrev
Instance, LPTSTR lpCmdLine, int nCmdShow)
MFC程序的启动 程序的启动
6、窗口注册及窗口创建 在CWinGreetApp::InitInstance函数内有 函数内有 ProcessShellCommand(cmdInfo)这个函数,在这个 这个函数, 这个函数 函数内实现窗口的注册 窗口的创建。 窗口的注册, 函数内实现窗口的注册,窗口的创建。 注意】由于框架、视图、工具条和状态条都是窗口, 【注意】由于框架、视图、工具条和状态条都是窗口, 所以在这个过程中都要创建这些窗口。 所以在这个过程中都要创建这些窗口。
MFC程序的运行机制 程序的运行机制
上机时间
周五下午第二大节
第4周 第5周 ~第9周 机房3A,3B 机房 3C,3D
公共邮箱
mfc_a210@163.com 密码 njustmfc_c104
作业上交方式
假设你的工程名为test, 则编译链接后会形成子目录test, 其中该目录下会有debug子目录, 将debug子目录删除,然后将test整 个目录压缩成一个文件发到邮箱。
MFC程序的启动 程序的启动
APPMODUL.CPP摘出来的代码 摘出来的代码
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevIns tance, LPTSTR lpCmdLine, int nCmdShow) { // call shared/exported WinMain return AfxWinMain(hInstance, hPrevInstance, lpCmd Line, nCmdShow); } _tWinMain函数的“_t”是为了支持 函数的“ 是为了支持 是为了支持Unicode而准备的一个 函数的 而准备的一个 宏
{ int nReturnCode = -1; CWinApp* pApp = AfxGetApp(); AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCm dShow); pApp->InitApplication(); pApp->InitInstance() nReturnCode = pApp->Run(); AfxWinTerm(); return nReturnCode; }
MFC程序的启动 程序的启动
a)AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)
它是个宏,实际调用 函数。 它是个宏,实际调用AfxEndDeferRegisterClass函数。 函数 #define AfxDeferRegisterClass(fClass) AfxEndDeferRegiste rClass(fClass) 定义于AFXIMPL.H中的宏 中的宏 定义于
MFC程序的启动 程序的启动
AfxGetApp()函数是取得 函数是取得CWinGreetApp对象指针,故上面函 对象指针, 函数是取得 对象指针 数第4至 行相当于调用 行相当于调用: 数第 至6行相当于调用: CWinGreetApp::InitApplication(); CWinGreetApp::InitInstance() CWinGreetApp::Run(); 因而导致调用: 因而导致调用: CWinApp::InitApplication(); //因为 CWinGreetApp 并没有改写 InitApplication 因为 CWinGreetApp::InitInstance() //因为 CWinGreetApp 改写了 InitInstance 因为 CWinApp::Run(); //因为 CWinGreetApp 并没有改写 Run 因为
MFC程序的启动 程序的启动
1、创建Application object对象 theApp 、创建 对象 程序一开始生产一个(且只有一个) theApp, 程序一开始生产一个(且只有一个)应用类对象 theApp, 也即一个CWinApp对象,这个全局对象一产生, 也即一个CWinApp对象,这个全局对象一产生,便执行其 CWinApp对象 构造函数,导致其基类CWinApp类的构造函数被调用。 构造函数,导致其基类CWinApp类的构造函数被调用。该 CWinApp类的构造函数被调用 函数定义于APPCORE.CPP第75行 因此,CWinApp之中的 函数定义于APPCORE.CPP第75行,因此,CWinApp之中的 APPCORE.CPP 成员变量将因为theApp这个全局对象的诞生而获得配置 成员变量将因为theApp这个全局对象的诞生而获得配置 theApp 与初值