执行一个程序,必然就产生一个进程(process)。最直接的程序执行方式就是在shell(如Win95的文件总管或Windows3.x的文件管理员)中以鼠标双击某一个可之星文件图标(假设其为App.exe),执行起来的App进程其实是shell调用CreateProcess激活的。
让我们看看整个流程:
1.shell调用CreateProcess激活App.exe。
2.系统产生一个「进程核心对象」,计数值为1。
3.系统为此进程建立一个4GB地址空间。
4.加载器将必要代码加载到上述地址空间中,包括App.exe的程序、资料,以及所需的动态链接函数库(DLLs)。加载器如何知道要加载那些DLLs呢?它们被记录在可执行文件(PE文件格式)的.idata section中。
5.系统为此进程建立一个执行线程,称为主执行线程(primary thread)。执行线程才是CPU时间的分配对象。
6.系统调用C runtime函数库的Startup code。
7.Startup code调用App程序的WinMain函数。
8.App程序开始运作。
9.使用者关闭App主窗口,使WinMain中的消息循环结束掉,于是WinMain结束。
10.回到Startup code。
11.回到系统,系统调用ExitProcess结束进程。
可以说,透过这种方式执行起来的所有Windows程序,都是shell的子进程。本来,母进程与子进程之间可以有某些关系存在,但shell在调用CreateProcess时已经把母子之间的脐带关系剪断了,因此它们事实上是独立实例。
摘自《深入浅出MFC》