MFC六大机制(-)程序启动机制

首先,我们要搞清楚的是,一个程序只能有一个入口,而MFC库中,恰好把程序入口给封装了,也就是说整个程序的流程给MFC接管了(谁写程序入口,谁接管程序的流程),但我们可以通过某种方式来修改这个流程。那么,到底是怎么样去修改里面的流程,从而实现我们想要的效果呢?以下将会作出详细的解答:
要说明的是,以下是自己通过看MFC源代码,总结出来的一个大概的过程,如有误,欢迎提出,大家共同进步。
首先,我们怎么才能知道MFC最先是从哪里开始执行的呢?我们可以先写一个自己的应用程序类继承于CWinApp(记得不要忘了要支持MFC库哦),定义一个全局的应用程序类对象,然后在这一行断点,以调试方式执行,然后通过调用堆栈(Alt + 7),可以看到一个最底层的函数WinMainCRTStartup(),就是从它开始的。其实无论是窗口应用程序,还是控制台程序都是从这个函数所在的源文件开始的,为什么这么说呢,因为在MFC中使用了条件编译的方式,不同的应用程序,函数名不同,控制台程序入口是mainCRTStartup()。
MFC函数入口声明的源代码:
#ifdef _WINMAIN_

#ifdef WPRFLAG
void wWinMainCRTStartup(
#else  /* WPRFLAG */
void WinMainCRTStartup(
#endif  /* WPRFLAG */

#else  /* _WINMAIN_ */

#ifdef WPRFLAG
void wmainCRTStartup(
#else  /* WPRFLAG */
void mainCRTStartup(
#endif  /* WPRFLAG */

#endif  /* _WINMAIN_ */
        void
        )
好了,现在谈谈程序启动机制的大致过程:
程序先从入口函数WinMainCRTStartup()开始执行。
做了一些准备工作,主要调用了_ioinit(),_cinit()两个函数。

其中在_cinit()调用了_initterm( __xi_a, __xi_z ),_initterm( __xc_a, __xc_z ),

我认为主要的准备工作就是在里面进行的,包括应用程序对象的创建。

其实_initterm的参数都是一个存放函数指针的数组,就是通过遍历数组来一一调用函数从而实现准备工作的。
在创建应用程序对象时,调用父类CWinApp的构造函数,主要功能是:把当前的应用程序对象地址分别存放到全局变量当前程序模块状态信息的一个成员和当前程序线程状态信息的一个成员中,说的好像很抽象,说白一点,不就是一个体面的名字而已,可以直接认为不就是把一个地址存放到aaa和bbb里面嘛!其目的是:后面使用时,方便拿。我们看MFC代码多的时候可以发现,它就是喜欢这样做,在某个地方赋值,在另外的地方取值。
准备工作完成后,继续往下执行,就会调用WinMain(...)函数,实现体就调用了一个函数AfxWinMain(...)。
AfxWinMain(...)函数主要做了4个工作
   1 通过全局函数AfxGetThread()和AfxGetApp()获取当前应用程序对象地址&theApp
   2 通过&theApp调用应用程序类成员虚函数InitApplication()实现初始化工作
   3 通过&theApp调用应用程序类成员虚函数InitInstance()实现窗口的创建、显示和更新
   4 通过&theApp调用应用程序类成员虚函数Run()实现消息循环
      在Run()中,先调用WIN32的API  PeekMessage(),查看消息队列中是否有消息,如果没有消息,就通过&theApp调用应用程序类成员函数OnIdle()进行空闲处理,如果有消息的话,就调用WIN32的API GetMessage(),取消息并且对象消息进行处理。如果获取到的消息是WM_QUIT消息的话,就会通过&theApp调用应用程序类成员虚函数ExitInstance()进行善后处理,最后退出程序。
好了,MFC的程序启动机制的大致流程捋完了,估计大家也应该知道怎么去修改程序流程了,就是自定义应用程序类,并且继承基类,重写虚函数,即可得到自己想要的结果。
最后,我想说的是,这是我第一次写博客,并且也是一个C++菜鸟,如果写的不好或者有表述不对的地方,请大家指出,谢谢大家。

转载于:https://www.cnblogs.com/LINIT/p/3505583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值