没有合适的资源?快使用搜索试试~ 我知道了~
SWT深入内幕之消息机制探秘
需积分: 9 181 下载量 167 浏览量
2007-07-20
12:52:29
上传
评论 1
收藏 383KB PDF 举报
温馨提示
试读
20页
[转载]深入介绍了SWT如何将Windows消息机制封装成为面向对象机制,是C/S程序员深入了解SWT的良好参考
资源推荐
资源详情
资源评论
第 20 页
SWT: 深入内幕之消息机制探秘
作者:Treenode
于 2006-6-3
前言
作为一个专注于 C/S 方面开发的程序员,我一直对“面向对象的编程框架如何与 Windows 操作系统
的消息机制打交道”这个问题有着相当大的兴趣。读者想必知道,象 MFC、VCL 和 SWT 这样的类
库在实现界面处理的时候,有几个主要问题是不得不考虑的。首先是如何为窗口和控件这样的界面
组件以面向对象方式进行包装。这一方面可以说没多少技术上的难题;从一般意义上讲,不过是把
HWND 作为第一个参数的函数分类整理一下而已。当 然 ,具体作起来还是有不少东西需要认真考虑,
只是这些问题多半是在设计的层面,考虑包装是否完善、维护和扩展起来是否方便等等;实现上基
本上就没多少需要克服的技术障碍了。而另一方面——即如何处理系统消息机制,则是一个颇费脑
筋的问题了。其中最大的难点之一,就是 Windows 的消息系统依赖于窗口过程(术语叫做 Window
Procedure),而这个窗口过程却是一个非面向对象的、普通的全局函数,它完全不理解对象是什么;
可是而为了让整个程序 OO 起来,你还非得让它去操纵对象不可。因此,如何将窗口过程用面向对
象的方法完美的封装起来,就成为各种类库面临的最大挑战之一。当然,这也理所当然的成为各个
开发小组展示自身功力的绝好舞台。
据我所知,在此一问题上,不同的类库使用了不同的解决方案。较早的 MFC 使用了窗口查找表的
技术,即为每个窗口和对应的窗口过程建立一个映射;需要处理消息的时候,则是映射表中找到窗
口所对应的过程,并调用之。这样会带来几个问题。首先是每次进行查表势必浪费时间,为 此 MFC
不惜在关键处使用 Cache 映射和内联汇编的方法以提高效率。第二个问题:映射表是和线程相关联
的,如 果 你将窗口传递给另外一个线程,MFC 无法在该线程中找到窗口的映射项,也就不知该如何
是好,于是只好出错。我已经在很多地方看到有人问跨线程传递窗口指针的疑问,多半都是因为不
理解 MFC 的消息处理机制。正因为如此,MFC 的使用者必须强制遵守一些调用方面的约定,否则
会出现很多莫名其妙的错误,这无疑是框架不够友好的表现。而稍晚出现的 VCL 和 ATL 则使用了
一种比较巧妙的 Thunk 技术,利用函数调用过程中使用堆栈的原理,巧妙的将对象指针“暗度陈仓”
地偷偷传递进去,并通过一些内存中的“小动作”越过了通常的处理机制。这样做的好处是节省了
额外维护映射表的开销,速度相当快,同时也不存在线程传递的问题。当然,这个过程因为大量使
用汇编,而且需要对函数调用的底层机制有深刻的理解,所以很难为一般程序员所理解和运用。(相
应的维护起来也难度也比较高——还记得 Anders 离开 Borland 以后相当长时间没有人敢改动 Delphi
底层代码的往事吗?)
在众多框架中,SWT 算是比较年轻的一个,也是颇为独特的一个。之所以说它特殊,因为它是用
Java 编写的。我们知道,和 Windows 平台上的本地开发工具不同,Java 程序是生活在自己的虚拟机
中的,除非通过 JNI 这个后门,否则它对底下的操作系统基本上一无所知。这显然为设计者提出了
更高的挑战。那么,SWT 又是如何实现这一点的呢?非常幸运,SWT 是完全开放源代码的(当然,
MFC 和 VCL 也是开放的,不过这种开放就稍显小家子气——许多时候你必须购买昂贵的企业版才
能看到这些宝贵的源码,D 版且不论)。开放源代码为我们研究其实现扫清了障碍。
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
第 20 页
由于使用 SWT 的过程中遇到一些障碍,我开始考虑有没有突破其限制的办法,也以此为契机阅读
了 SWT 的部分源代码,了解到其中一些底层的东西。本文可以说是这次研究的副产品。我把自己
的一些心得整理出来,希望有类似爱好的朋友能从中发现一些有趣的东西。当然,更希望对 SWT
有丰富经验的读者来批评指正。
本文欢迎转载,但是请不要随意修改文中的内容。
准备工作
在上路之前,我 们 应 当 准备好足够的武器。当 然 ,Eclipse 是必不可少的——我使用的是最新的 Eclipse
3.2 RC6 版本,不过只要是 3.x 的版本,在核心代码方面不会有很大差别,所以对本文的目的而言,
Eclipse 3.0 以上的任何版本应该都是够用的。此外,如果你还没有安装任何界面开发方面的插件的
话,我强烈建议你安装一个 Eclipse.org 官方的 Visual Editor。这倒不是说我认为该插件对界面开发
有多大的助力——事实上在我看来,它的功能要比 SWT Designer 等同类工具逊色;但是该插件最大
的好处在于可以非常简单的设定好 SWT 程序所运行的环境,还包括了源代码支持,这样你就可以
很轻松的跟踪到 SWT 源代码内部去了。此外,这个工具是没有使用限制的,也不需要注册激活,
以学习的目的而言这是一个胜于 SWT Designer 的优点。
Visual Editor 和 Eclipse 平台的其他插件都可以从 http://www.eclipse.org/downloads 上下载。
安装 Visual Editor 以后,你可以在创建项目的过程中使用 Java Settings 页面,或者在项目创建以后
再选择项目属性,在 Java Build Path 分类下的 Libraries 页面访问同样的设置界面:
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
剩余19页未读,继续阅读
资源评论
Reker熊
- 粉丝: 383
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2SJ343-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- 一款基于Matlab的像素级图像标记工具,支持FITS、JPG、PNG、TIF等图像格式,可导出所有标记点坐标+源代码+文档说明
- 基于javaweb的在线答题平台.zip
- 三菱PLC例程源码丹佛斯变频器与FX通讯实例(适用于所有丹佛斯变频器)
- 微信每日早安问候(用微信传递爱情).zip
- 基于matlab-模板匹配-角度修正的铭牌识别+源代码+文档说明
- 三菱PLC例程源码丹佛斯VT2800与FX2N用RS485通讯示例
- 微信 macOS 客户端增强 Tweak 动态库.zip
- UAM概念飞机 UAM概念飞机
- 一个使用 Java 开发的、类似 WordPress 的产品,支持多站点、多语种自动切换等.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功