- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Thunk技术原理及其在Windows系统窗口类封装中应用
Thunk技术原理及其在Windows系统窗口类封装中应用
摘要:该文主要介绍了Thunk技术的基本原理,以及如何利用Thunk技术封装基于C++语言的Windows窗口类。该文还介绍了如何利用ATL中已有的Thunk代码实现窗口类的封装以简化代码的编写工作。利用本文介绍的技术封装窗口类可极大的精简代码规模,同时代码的运行效率也较高。
关键词:Thunk;C++;Windows;窗口类;ATL;形实转换
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)10-0248-03
一直以来,使用C++语言封装Windows窗口类都是一个比较繁琐的工作。大多数软件开发人员都是使用第三方类库进行Windows窗口类的编写,比如最常使用的就是Microsoft公司的MFC类库以及ATL模板库等。这些类库虽然功能强大,但是它们都过于庞大、复杂,如何使用简单的技术实现轻量级的Windows窗口类(以下简称窗口类)是广大软件开发人员一直在探讨的问题。
封装窗口类的难点是如何让Windows窗口处理回调机制在消息发生时调用窗口类的非静态成员函数。
我们知道,C++在调用非静态成员函数时需要传递this指针,由于Windows系统只能调用静态的回调函数,而类的静态成员函数是没有this指针的,因此,如何将this指针传递给类的静态成员函数(窗口处理回调函数)就成为封装窗口类的关键技术。到目前为止,向类的静态成员函数传递this指针的方法主要有三种:静态表查询方式,修改窗口用户数据(USERDATA)方式,Thunk方式。其中Thunk方式是最直接、最高效的方式,本文主要讨论Thunk方式。
1 基本原理
Thunk在程序设计领域被称为形实转换程序,其基本思想就是将若干连续存储的数据直接解释成代码让CPU执行,本质上相当于直接使用机器语言编程。
利用Thunk技术封装窗口类的基本思路是:将一段精心设计的数据(实际是一些机器指令,以下将这段数据简称为Thunk数据)解释成Windows窗口处理函数,同时将this指针存储在这些数据中,从而达到传递this指针的目的。
2 关键技术
虽然理论上可以在Thunk数据中使用机器代码完成对类的非静态成员函数的调用,但是这需要完全模拟C++对类的非静态成员函数的调用机制,而这种机制是比较复杂的,并且可能会在将来有所改变。为了尽量缩短Thunk数据代码的长度,一种更好的方式是在Thunk数据代码中调用另一个静态的窗口处理函数(以下简称中转处理函数),同时采用一种技术将this指针传递给该中转处理函数。
向中转处理函数传递this指针的方式基本上有两种:
1) 在标准Windows窗口处理函数的参数列表中增加一个参数并将this指针传递给这个参数,即使用非标准形式的窗口处理函数,但这种形式会增加Thunk数据代码的复杂度;
2) 使用标准形式的窗口处理函数并将其参数列表中的某个参数修改为this指针值,这种方式将最大程度的降低Thunk数据代码的复杂度,因此采用这种方式较好。
Windows窗口处理函数的标准形式如下:
代码 1 WindowProc
其参数列表中一共有4个参数,除hwnd参数以外的其他3个参数都有其特定用途,唯有hwnd,它代表目标窗口句柄,而这个句柄完全可以预先保存在类(对象)中然后通过this指针访问它,因此可以在Thunk数据代码调用中转处理函数之前将hwnd参数用this指针值替换掉,从而达到传递this指针的目的。
在中转处理函数中,通过强制类型转换,将hwnd参数硬性解释成this指针,并通过该this指针调用类的非静态窗口处理成员函数,从而达到了让Windows窗口处理回调机制调用窗口类非静态成员函数的目的,至此就完成了窗口类的封装。
3 实现细节
使用Thunk技术封装窗口类的大体实现细节如下:
在窗口类中定义一个THUNK结构类型的成员变量_thunk及初始化该结构的成员函数InitThunk();
THUNK结构实际是一段经过仔细设计的机器代码,当将THUNK变量地址当成函数地址来解释并调用它时,将执行这段代码,在本例中就是要将其解释成WNDPROC类型的指针,即Windows的窗口处理回调函数,这样在回调发生时THUNK代码将被执行。
在窗口类中提供一个attach(HWND h)函数,其将修改目标窗口h的窗口处理函数地址,使其指向this-_thunk,在执行这条语句之前应先调用InitThunk()初始化_thunk成员,使其中保存this指针值,也就是说,每个窗口类对象中都会有一个含有对象地址信息(即th
您可能关注的文档
- SSR模式在无机非金属材料专业本科生教学中应用.doc
- SSR标记在棉花遗传育种中应用.doc
- SSR法鉴定水稻两系杂交种纯度运用与探讨V.不同引物检测同一品种纯度准确性V.不同引物检测同一品种纯度准确性.doc
- SSR鉴定水稻两系杂交种纯度运用与探讨I.亲本和杂交种分别筛选引物适用性.doc
- SST湍流模型在强逆压流模拟中应用.doc
- ST2与冠心病研究进展.doc
- STAAD.PRO软件在国外工程钢结构管廊设计中应用.doc
- STAAD软件在煤气柜设计中应用.doc
- STAD合作学习方法在大学英语教学中应用.doc
- STARD7真核表达载体构建及肝癌细胞HepG12稳定转染株建立及鉴定.doc
文档评论(0)