转载--详细剖析 Windows程序的关闭过程

来源:互联网 发布:南方舞厅 知乎 编辑:程序博客网 时间:2024/04/29 03:44

 Windows程序的关闭过程   
  zyl910原创   
    
  --   Windows系统内核   -----   
  1.操作系统查询鼠标驱动,将鼠标操作翻译成Wndows消息并放入系统消息队列   
  2.在系统消息队列的鼠标消息利用发送WM_NCHITTEST消息得知该鼠标消息该发给那个窗口(的线程消息队列)   
  --   应用程序   -------------   
  3.在该线程的消息循环中,GetMessage得到一条消息,并用DispatchMessage分发该消息到该窗口的窗口函数   
  4.由于关闭按键在非客户区,所以窗口函数收到的是WM_NCLBUTTONDOWN消息。由于应用程序一般不处理非客户区消息,该消息最终交给DefWindowProc函数   
  5.DefWindowProc函数处理WM_NCLBUTTONDOWN消息时,发现现在正点击在关闭按钮上,于是更新“关闭按钮”的图像,并用SetCapture设置鼠标捕获(这样鼠标消息会不断的发送到该窗口),还有一些界面性操作就不细说了(如设置浮动提示)   
  6.经历了许多WM_NCMOUSEMOV消息(谁敢说自己点鼠标时鼠标没颤动)后,DefWindowProc函数终于接受到了WM_LBUTTONUP消息。现在它判断鼠标坐标是否在关闭按钮的坐标范围内,若是,则表示真的是点了“关闭”,此时DefWindowProc函数会向窗口函数发送WM_SYSCOMMAND消息、SC_CLOSE参数   
  7.一般窗口函数不处理WM_SYSCOMMAND消息,所以该消息又传给了DefWindowProc(注意此时发生了重入现象)   
  8.DefWindowProc处理WM_SYSCOMMAND消息的策略是:用GetSystemMenu取得系统菜单,并检查SC_CLOSE菜单项是否可用,若可用,则发送向窗口函数发送WM_CLOSE消息   
  9.窗口函数一般对于WM_CLOSE消息的处理是:弹出一个对话框,问你是否退出。若否,窗口函数返回0。若是,将该消息传递给DefWindowProc继续操作(2次重入)   
  10.DefWindowProc调用DestroyWindow摧毁窗口   
  11.DestroyWindow在摧毁窗口前,向窗口函数发送WM_DESTROY消息通知窗口即将摧毁   
  12.窗口函数执行资源释放操作,若是主窗口则调用PostQuitMessage通知程序即将结束(只是标记状态,实际操作在下面),还依然调用DefWindowProc释放内部资源(3次重入),函数调用完后又回到DestroyWindow   
  13.DestroyWindow正式摧毁窗口及该窗口的子窗口(控件),完成后向窗口函数发送WM_NCDESTROY消息通知窗口已经摧毁   
  14.窗口函数和DefWindowProc一般不处理WM_NCDESTROY消息,只是简单的返回。此时再也没有任何操作,只有一连串的函数返回:DestroyWindow、WM_CLOSE、WM_SYSCOMMAND、WM_LBUTTONUP、DispatchMessage,最终回到了消息循环   
  15.由于PostQuitMessage做了标记,所以GetMessage返回0,退出消息循环,执行WinMain下面的代码(一般是释放程序资源的代码)   
  --   编译器   --------------   
  16.WinMain执行完毕后,现在执行的是编译器插入的代码,用于释放全局变量(调用相应对象的析构函数)等资源释放操作   
  --   Windows   -------------   
  17.当编译器代码执行完后,程序会回到Windows系统安排的线程启动代码,这将自动调用ExitThread及ExitProcess(主线程)结束线程   
  --   Windows内核   -----------   
  18.当某个线程、进程即将终止时,Windows调用各个dll的入口函数,通知线程、进程即将终止   
  19.进程真的要中止了,先将该进程的所有线程冻结(既这些线程再也不会分配到CPU时间片),再释放相关资源:dll、内核对象、虚拟内存空间   
  20.当上面的一切完成时,Windows再在进程列表中去掉该进程   

原创粉丝点击