说说安全子类

原创 2005年05月27日 14:30:00

作者:袁晓辉    文章来源:www.farproc.com   更新时间:2005-5-25

说说安全子类

说起“窗口子类化”(Subclass Window),估计大家都不陌生吧?不就是SetWindowLong (hwnd, GWL_WNDPROC, NewProc)嘛,如果还有什么要说的话,那就是为了兼容3264Windows,换用SetWindowLongPtr吧。就这么简单吗?其实越是看起来简单的东西,往往越容易被误用,我们来看一个例子:

 

 

这看似没有问题的代码真的可靠吗?未必!!

想想吧,如果在我们做“... 一些操作 ...”的时候,又有一个程序子类了该窗口(hwnd)会怎么样?那个子类会用它的procedure替换我们的NewWndProc,并保存我们的NewWndProc指针。这时windows消息会先经过它的procedure,到我们的NewWndProc,然后我们传递给OldWndProc。当我们替换回原来的窗口过程时发生了好么?我们恢复了OldWndProcwindows消息直接传递给了OldProc,而不会经过后来的那个子类的procedure了,我们一下子取消了两个子类!一个是我们添加的,一个是在我们之后添加的。如果后来的那个子类的procedure在堆上分配了内存,准备在收到WM_DESTROY时释放,那么它永远都收不到这个消息,这块内存也就泄漏了……

不要以为子类的添加和删除是一个“入栈、出栈”的操作(你只能操作栈顶也就是最后入栈的元素)。如果你想要删除你的子类,而你窗口procedure并没有位于子类链的最顶端的话,你就不能安全地删除你的子类。如果你在这时移除了你的子类并恢复了你所保存的旧prodecure的话,那么在你后面添加的子类都被你从子类链上“摘掉”了。安全的做法是你必须等待,直到可以安全删除你的子类时再删除,并且在等待期间把收到的任何消息传递给前一个procedure处理。

这是很令人讨厌的,所以,微软为我们准备了好用的函数来帮我们完成这些操作。用SetWindowsSubclass(位于Windows XP自带的CommCtl32.dll 6.0版中。 后面的几个函数也一样) 可以很方便地添加一个子类,它会在内部保存前一个子类的必要信息,传递你指定的“参考数据”到子类的procedure。用DefSubclassProc 传递消息到前一个子类。完成操作时,用RemoveWindowSubclass 删除你添加的子类本身,这个函数会自动做好所有的处理,你不必担心你的procedure是否位于子类链的顶端。但是有一点同样需要注意,你必须在被窗口(hwnd)销毁前删除你的子类。

 

 

微软为我们提供的这中“安全”子类的机制非常棒,目前用的人却不是很多,可能是因为它只能在XP系统上用的缘故吧。但不管如何,我们还是关心一下新技术的好,说不定哪天能用得着。

 

 参看这里:子类化控件的新方法

 参看这里:子类化控件的新方法

 

注:本文部分内容参考这里

集合框架_List的三个子类的特点

List:(面试题:List的子类特点) ArrayList: 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 Vector: 底层数据结构是数组,查询快,增删慢。 线...
  • L1585931143
  • L1585931143
  • 2016年12月19日 19:02
  • 386

List具体子类,及之间的区别

List:有序,可重复,有索引。 |--ArrayList:底层是数组数据结构。是线程不同步的。查询元素的速度很快。但是增删元素的效率稍低。 |--LinkedList:底层是链表数据结构,是线程...
  • u010940300
  • u010940300
  • 2015年03月10日 17:38
  • 1345

web安全的重要性

经常看到在项目中ajax post提交数据到服务器不加防伪标记,造成CSRF攻击,在ajax提交数据的时候,可以添加令牌环,进行数据提交的安全验证,这样可以防止CSRF攻击,提高网站的安全性。   ...
  • qq165285727
  • qq165285727
  • 2016年11月30日 09:02
  • 253

C#中子类与父类的相互转换

C#中子类与父类的相互转换 1.父类不能直接强制转换成子类 2.子类可以强制转换成父类,但是在父类中只能取父类的字段与方法     因此在一个父类对应多个子类的时候,不知道具体是哪个子类的时候...
  • LiuFengSh
  • LiuFengSh
  • 2016年10月12日 15:18
  • 3828

jquery实现qq空间发表说说模板

腾讯技术_QQ空间说说发表系统             *{margin:0px; padding:0px;} body{background:url('img/...
  • luo1728210158
  • luo1728210158
  • 2016年06月25日 22:20
  • 550

如何做一个类似QQ说说体系的表结构(一)

如何做一个类似QQ说说体系的表结构 分析首先用户是一个单独表,包括用户基本信息。 对于说说表,可以包括一些基本的信息,包括说说文字、发表日期、发表地点、浏览次数、点赞数等。但是,说说中的图片不能放...
  • wgyscsf
  • wgyscsf
  • 2016年03月19日 12:09
  • 1615

Android 发表说说一般用到的界面布局

OK, 看到这里应该明白我标题的意思了吧.哈哈. 首先, 来个布局(activity_select_pic.xml) ? 1 2 3 4 ...
  • zdmxhyy
  • zdmxhyy
  • 2016年01月12日 16:56
  • 1536

仿QQ写说说效果的实现

今天同学问了关于仿QQ写说说界面的实现,个人感觉就是如同评论,回复的那种效果,按捺不住,就仿写了一回,大家不要见笑啊首先,我们需要根据需求进行分析这里我们看见刚进入的时候不显示键盘跟被键盘顶起的布局,...
  • qq_16131393
  • qq_16131393
  • 2016年03月20日 00:54
  • 2933

纯代码给wordpress增加说说/微博/微语功能

纯代码给wordpress增加说说/微博/微语功能作为一个独立的个人博客,说说怎么少得了,有时候我们写日志,或者做通告,长不长,短不短的话语总是纠结怎么写成文章,但是为了人性化,像qq空间的说说,em...
  • LIU_YANZHAO
  • LIU_YANZHAO
  • 2017年02月08日 21:34
  • 888

代码自动删除QQ空间里的说说

来到QQ空间,点击“说说” 然后右键:审查元素,选择Console 复制下面的代码到Console中:  var delay = 1000;     function del()...
  • ixiaowei1993
  • ixiaowei1993
  • 2016年08月26日 10:24
  • 1744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:说说安全子类
举报原因:
原因补充:

(最多只允许输入30个字)