• 我的订阅
  • 科技

窗口销毁消息 WM_DESTROY 的正确处理方式

类别:科技 发布时间:2022-12-13 09:00:00 来源:漫漫开发路

上次,我提到了可能导致正常的消息循环被破坏的怪异之处。

有一位读者 Adrian 指出,WM_GETMINMAXINFO 消息在顶级窗口 WM_NCCREATE 之前到达。这确实很不幸,但(无论是否错误)十多年来一直如此,现在修改它会引入严重的兼容性风险。

但这不是我想到的怪异之处。

前段时间,我正在帮助调试一个使用 ListView 控件的程序的问题,该问题可追溯到 ListView 控件子类化的程序,并通过复杂的C++对象链,最终尝试销毁 ListView 控件,而它已经在销毁过程中。

让我们以新的例子程序为例,以一种更加明显的方式来说明我所提到的问题。

窗口销毁消息 WM_DESTROY 的正确处理方式

我在代码中添加了一些调试跟踪,以便更轻松地查看正在发生的事情。运行程序,然后关闭它,并观察会发生什么。

窗口销毁消息 WM_DESTROY 的正确处理方式

哎呀!发生了什么事?

当您单击窗口右上角的关闭按钮时,这将启动窗口销毁过程。正如预期的那样,窗口收到了一条 WM_DESTROY 消息,但程序通过尝试再次销毁窗口来响应此消息。请注意,IsWindow 报告此时该窗口仍然存在。这是真的:窗口仍然存在,尽管它恰好正在被破坏的过程中。在原始场景中,破坏窗口的代码类似于下面的代码:

if (IsWindow(hwndToDestroy))

{

DestroyWindow(hwndToDestroy);

}

无论如何,对 DestroyWindow 的递归调用导致一个新的窗口销毁周期开始,嵌套在第一个窗口内。这将生成一条新的 WM_DESTROY 消息,后跟一条 WM_NCDESTROY 消息。(请注意,此窗口现在已收到两条 WM_DESTROY 消息!然后,我们的代码对DestroyWindow 进行了另一个递归调用,从而开始了第三个窗口销毁周期。窗口获取其第三条 WM_DESTROY 消息,然后是第二条 WM_NCDESTROY 消息,此时返回对 DestroyWindow 的第二次递归调用。此时,窗口不再存在:DestroyWindow 已销毁窗口。

这就是程序崩溃的原因。基类通过销毁与窗口关联的实例变量来处理 WM_NCDESTROY 消息。因此,当最里面的 DestroyWindow 返回时,实例变量已被丢弃。然后,使用基类的 WM_NCDESTROY 处理程序恢复执行,该处理程序尝试访问实例变量并获取堆垃圾,然后使释放已释放的内存变得更糟,从而损坏堆。正是在这里,我们崩溃了,试图在已经破坏的对象上调用虚拟析构函数。

我有意选择使用新的例子程序(使用C++对象)而不是经典的例子程序(使用全局变量)来强调这样一个事实,即在递归 DestroyWindow 调用之后,所有实例变量都消失了,你正在已经释放的内存上运行代码,这很危险。

故事的寓意:了解你的窗口的生命周期,不要破坏一个你知道已经处于破坏过程中的窗口。

总结

在非托管平台上编写代码如履薄冰,你需要时时谨慎,因为,不再有人能暗中保护你了。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《When the normal window destruction messages are thrown for a loop》

窗口销毁消息 WM_DESTROY 的正确处理方式

返回搜狐,查看更多

责任编辑:

以上内容为资讯信息快照,由td.fyun.cc爬虫进行采集并收录,本站未对信息做任何修改,信息内容不代表本站立场。

快照生成时间:2022-12-14 22:16:36

本站信息快照查询为非营利公共服务,如有侵权请联系我们进行删除。

信息原文地址:

更多关于消息,方式,处理的资讯:
如何巧妙处理微信不回的问题?
...生活中不可或缺的沟通工具。然而,当我们在微信上发送消息却得不到回应时,往往会感到困扰和不安。如何聪明且有格局地处理这种情况,不仅体现了我们的情商和智慧,也展现了我们的成熟与大
2024-06-09 09:34:00
对象不回消息?别急,这里有解!
在现代社交的浪潮中,消息传递已成为我们日常沟通的主要方式。然而,当我们的对象突然不再回复消息时,心中难免会产生疑虑和不安。面对这种情况,我们应该如何应对呢?接下来,我将从多个维度
2024-07-10 14:17:00
应对“已读不回”时最高明的处理方式,无非这两种
...个世界上,最浅显易懂的答案。”你有过类似的经历吗?消息发出去很久,可迟迟等不到对方的回复;自己主动发送的消息数条,可对方连一个表情包都不愿意施舍。看似对方真的没有回复,但“已
2023-01-27 20:46:00
邮报:曼联员工对处理青木安东尼事件的方式很失望,可能选择离职
...。后来指控被撤销,格林伍德被租借到赫塔费。上个月有消息称,安东尼因涉嫌袭击前女友而正在接受警方调查。这名边锋最初被曼联给予了一段时间的全薪休假,但后来又回到了俱乐部,关于曼联
2023-10-12 03:03:00
了解这些特点,我们可以更好地处理人际关系,并减少冲突和误解
...活中必不可少的一部分。在微信中,有些人会对其他人的消息秒回,这说明他们可能拥有某些特定的脾气和习惯。那么,这些人的特点到底是什么呢?本文将根据作者的观察和经验,介绍四种喜欢秒
2023-07-05 21:10:00
情人不回消息了,聪明的女人,大多会用这几种方式撩他
在感情世界里,偶尔会遇到情人不回消息的情况,这可能会让人感到焦虑和无助。然而,聪明的女人,会用合适的方式去应对这种情况,以便于让关系升温。只要方式得当,不仅能够保持自己的尊严和独
2023-12-07 13:10:00
如何提高im服务的用户体验
...以下几个方面探讨如何提升IM服务的用户体验。一、提高消息传输速度和成功率消息传输速度和成功率是影响用户体验的重要因素。为了提高消息传输速度,可以采取以下措施:1.优化服务器架
2024-06-29 02:55:00
2023 年 MQTT 协议的 7 个技术趋势|描绘物联网的
...tone)Shi:EMQX欧洲研发中心负责人,拥有多年大规模分布式MQTT消息系统开发经验,致力于与EMQ斯德哥尔摩研发团队一起将EMQX打造成为全球最优秀的MQTTbroker
2023-04-18 16:28:00
郭帆被冒充!《流浪地球3》发布辟谣声明:朋友圈临时演员招募系假消息
快科技5月1日消息,近日,电影《流浪地球3》剧组(下称“剧组”)发现有第三方机构或个人冒用郭帆导演、剧组合作方等身份,通过社交平台自媒体账号对外发布“临时演员招募通知”、“投资方
2025-05-01 12:37:00
更多关于科技的资讯:
近日,市场监管总局和国家网信办联合发布《网络交易平台规则监督管理办法》(以下简称《办法》),明确禁止平台利用大数据“杀熟”
2026-02-08 00:15:00
潮起章丘,一城所向:章丘世茂广场盛大开业,开启城市商业新主场
鲁网2月7日讯2026年2月6日,中国济南——由章丘控股集团与世茂集团商业地产商娱公司(以下简称世茂商娱)联袂打造的章丘世茂广场盛大开业
2026-02-07 16:32:00
“人机协同”新模式进楼宇,顺丰同城×顺丰速运机器人配送落地南昌双子塔
近日,顺丰同城与顺丰速运携手推出楼宇机器人末端配送新业务,于2月5日率先在江西南昌标志性建筑之一南昌双子塔投入运营。双方聚焦商务楼宇等高层建筑的末端配送难点
2026-02-07 16:48:00
中国科大建立磁各向异性的普适理论
大皖新闻讯 2月7日,大皖新闻记者从中国科学技术大学获悉,该校牛谦教授与高阳教授团队在磁各向异性理论研究中取得突破。研究团队基于自旋轨道耦合的微扰展开以及自旋群的群表示
2026-02-07 12:48:00
厦门网讯(厦门日报记者 应洁)马年新春将至,集美区年味渐浓。2月6日,由集美区商务局主办的“2026集美欢乐购”新春消费券正式“开抢”
2026-02-07 08:49:00
老人也能轻松操作!海尔智家APP“AI语音”让服务零门槛
智能家电功能日益丰富,售后环节的复杂化却成了很多用户的“数字门槛”。在智慧家庭战略指导下,海尔智家APP推出“AI语音”功能
2026-02-07 10:07:00
海尔智家APP“3D家庭视图”将操作效率提升60%
当智能家电数量不断增加,如何高效、直观地管理成了很多用户的“甜蜜负担”。海尔智家APP在智慧家庭战略指引下,通过数字孪生技术打造“3D家庭视图”功能
2026-02-07 10:09:00
从套购到套系,海尔智家靠近用户实现双第一
1月29日,中国家用电器服务维修协会发布《2026年家电服务业及新兴市场发展趋势预测》。报告指出,全屋智能和AI技术正成为推动市场增长的重要力量
2026-02-07 10:10:00
近日,中国科学技术大学的潘建伟院士团队在量子网络领域取得重要突破,首次构建出可扩展量子中继的基本模块,并在此基础上首次将设备无关量子密钥分发的传输距离突破百公里
2026-02-07 10:52:00
大皖新闻讯 近年来,安徽首创金融支持科创企业“共同成长计划”和“贷投批量联动”模式,科技型企业贷款4年连跨7个千亿台阶
2026-02-07 08:44:00
今天,“浙江第一摩天轮”——“天目之心”将在临安天目未来谷正式开转。“天目之心”摩天轮高131.4米,寓意“一生一世”的浪漫
2026-02-07 07:28:00
纵览原创|河北首家SUPER MINISO来了!石家庄 “首店经济”再添消费新场景
记者宋瑶 见习记者杨思涵2月6日,名创优品旗下SUPER MINISO超级名创河北首店在石家庄核心商圈中山路北国商城负一层正式开业
2026-02-07 07:33:00
河北日报讯(见习记者康晓博)2月4日,“AI+机器人”领域领军企业北京极智嘉科技股份有限公司(以下简称“极智嘉”)在雄安新区举行总部揭牌仪式
2026-02-07 07:39:00
邦德激光正式入驻Dream Park全球总部基地
近日,邦德激光总部员工全部迁入位于济南市历城区春晖路3999号的Dream Park全球总部基地,标志着公司发展进入全新阶段
2026-02-06 20:50:00
2026年WGS世界政府峰会 迪拜王储乘坐百度萝卜快跑无人车参会!
“解放双手、未来已来!”在体验完萝卜快跑全无人驾驶后,迪拜王储谢赫·哈姆丹主动在海外社交媒体上发文,赞叹这次“非常丝滑”的未来出行
2026-02-06 17:08:00