第一讲Windows程序内部运行原理重点解析.ppt

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * Windows 程序内部运行机制 回调函数 凡是由你设计而却由Windows系统调用的函数,统称为Callback函数。这些函数都有一定的类型,以配合Windows的调用操作。 除了窗口过程函数,Windows API还有一些其它的回调函数,例如SetTimer、LineDDA、EnumObject。这种函数会在进行某种行为之后或满足某种状态之时,操作系统自动调用该函数。 * * Windows 程序内部运行机制 小小知识:函数的三种调用方式 __cdecl 是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。 __stdcall 调用约定用于调用Win32 API函数。采用__stdcall约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。 __fastcall 约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可以写成_fastcall。 * * Windows 程序内部运行机制 三种调用方式的特别说明 在默认情况下,VC采用__cdecl方式,因此可以省略. WINAPI一般用于修饰动态链接库中导出函数 CALLBACK仅用于修饰回调函数 * * Windows 程序内部运行机制 DefWindowProc 我们的程序无论多大都不可能将所有的消息都处理,所以我们必须有一个机制让不感兴趣的、不需要我们处理的消息,交还给Windows操作系统为我们处理,这个过程就是由DefWindowProc函数来实现的,也是每个程序所必备的。 * * Windows 程序内部运行机制 WM_DESTROY 当窗口被销毁时会产生这个消息(通常也是准备退出应用程序的时候),对于这个消息的响应是每个程序所必备的。怎样响应呢? 响应方式就是调用PostQuitMessage函数,该函数会在消息队列中添加一个WM_QUIT消息,准备让由消息循环中的GetMessage取得。当消息循环中的收到WM_QUIT消息时,GetMessage会传回0,从而结束消息循环,进而结束整个程序。 * * Windows 程序内部运行机制 WM_QUIT PostQuitMessage PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回0,从而结束消息循环,程序退出。 强烈建议PostQuitMessage放在WM_DESTROY消息响应里面调用,让程序正常有序的结束,因为通常销毁窗口是程序运行的最后一步。 当然,PostQuitMessage可以放在窗口过程的任何一个地方,让程序随时结束,但是这种做法就像采用拔电源的野蛮方式来关机,不可取~! * * Windows 程序内部运行机制 WM_CLOSE 当我们按下窗口右上角的叉号或者按下左上角系统菜单中的“关闭”命令时,系统会送出WM_CLOSE消息。通常程序的窗口过程函数不拦截此消息,而是交由DefWindowProc函数来处理。DefWindowProc函数在收到WM_CLOSE消息后,会自动调用DestroyWindow把窗口销毁。(调用DestroyWindow会产生WM_DESTROY消息) 当然,你可以不让DefWindowProc处理,而是自己处理WM_CLOSE消息。例如询问用户是否真的退出程序:如果用户选择“取消”,你忽略此消息,那么程序照常运行;如果用户确认要退出,必须手工调用DestroyWindow。 * * Windows 程序内部运行机制 WM_PAINT Windows 把一个最小的需要重绘的正方形区域叫做“无效区域”。当 Windows 发现了一个“无效区域“后,它就会向该应用程序发送一个 WM_PAINT 消息,通知应用程序重新绘制窗口。 当窗口从无到有、改变尺寸、最小化后再恢复、被其他窗口遮盖后再显示时,窗口的客户区都将变为

文档评论(0)

奇缘之旅 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档