注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火车的家

Put first thing first

 
 
 

日志

 
 

2012.11.20 windows 消息处理函数注册机制  

2012-11-20 20:42:26|  分类: 技术博客 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

windows窗口的每个实例都需要注册一个消息处理函数。这些处理函数都是类的成员函数,而setwindowlong(设置窗口消息处理函数的api)只接受全局或静态函数作为参数,那么mfc或者wtl是怎么把类的成员函数传给这个api的呢?
有两种方法:

1)全局函数做wrapper
对于一个窗口类,它所有的窗口实例都注册同一个静态函数作为消息处理函数,这个静态函数通过查询全局变量(可能是一张由窗口句柄和窗口实例组成的表)来调用对应实例的消息处理函数。

2)thunk技术
简单地说,thunk技术就是把类的成员函数转换为静态函数传给api,但是实际的实现要复杂得多。首先要在每个类的实例后面附加一小段数据区,并将其强制转换为函数指针传给api作为回调函数。这个数据区实际上保存了一段汇编代码,作用是查到对应实例的this指针,并调用类成员函数来处理消息。

注意:
a. 不能直接把类成员函数转为静态函数传给api。因为窗口类的所有实例共享同一个c++函数的代码段,所以这么做的话,会导致所有实例注册同一个函数。
b. 具体实现参考这两篇文章:
http://tassardge.blog.163.com/blog/static/172301708201210194524418/
http://tassardge.blog.163.com/blog/static/1723017082012101945819269/
  评论这张
 
阅读(446)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017