几年前曾经看过侯俊杰老师的《MFC深入浅出》,觉得这本书对MFC的讲解比较深入,由浅入深,对C++的基础、Windows程序的基础、MFC的原理等讲的都比较好。通过几年的工作学习,我对MFC的理解也有了进一步的提高,想再去看一遍这本书,最近看了第一章,就想写点东西来增加自己的理解,也顺便开始我的博客之旅。我的第一篇文章,想谈谈Windows程序的开始和结束。
每当我们双击桌面上的应用程序图标时,Windows的Shell程序(我的理解可能类似于Windows的任务管理器之类,检测用户的动作)就会创建一个进程,就像我们在程序中显式调用CreateProcess一样,但是这时程序并没有真正运行起来。首先,系统会为创建的进程分配内存空间,一般32位的机器上都是4GB,用于加载程序的数据、代码以及相关的依赖库文件。在这4G的地址空间中,有2G的空间是进程独有的,即每个进程的2G空间不相干扰、互不能访问,另外2G空间用于加载Windows内核程序,这些是每个进程共享的。在这之后,系统会调用C Runtime库中的Startup代码,并在其中调用应用程序的main或者WinMain函数,我的理解应该是进程运行环境准备好后,C Runtime的Startup代码会创建一个主线程,这样main或WinMain函数就会运行在主线程中了。
每一个Win32程序都有一个WinMain函数,这相当于控制台程序的main函数,是我们自己写的代码的入口点,虽然它并不是程序被调用的第一个函数。进入WinMain函数后程序需要调用RegisterClass注册一个窗口类,这应该是告诉系统窗口的名称、类型、大小等属性,是描述Win32程序的类,而显示出来的窗口只是这个类的一个实例。注册窗口时必须要