【快播报】窗口销毁消息 WM_DESTROY 的正确处理方式
上次,我提到了可能导致正常的消息循环被破坏的怪异之处。
有一位读者 Adrian 指出,WM_GETMINMAXINFO 消息在顶级窗口 WM_NCCREATE 之前到达。这确实很不幸,但(无论是否错误)十多年来一直如此,现在修改它会引入严重的兼容性风险。
(资料图片仅供参考)
但这不是我想到的怪异之处。
前段时间,我正在帮助调试一个使用 ListView 控件的程序的问题,该问题可追溯到 ListView 控件子类化的程序,并通过复杂的C++对象链,最终尝试销毁 ListView 控件,而它已经在销毁过程中。
让我们以新的例子程序为例,以一种更加明显的方式来说明我所提到的问题。
我在代码中添加了一些调试跟踪,以便更轻松地查看正在发生的事情。运行程序,然后关闭它,并观察会发生什么。
哎呀!发生了什么事?
当您单击窗口右上角的关闭按钮时,这将启动窗口销毁过程。正如预期的那样,窗口收到了一条 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》
返回搜狐,查看更多
责任编辑:
标签: 窗口销毁
推荐
-
applewatch蜂窝版怎么用?applewatch怎么连接新手机?
apple watch 蜂窝版怎么用apple watch 蜂窝版使用需要开通esim卡才能使用蜂窝版的功能。开通esim卡...
来源: -
iphone12支持红外遥控吗?iphone12的录音功能在哪里?
iphone12支持红外遥控吗?iphone12不支持红外遥控。如果想要在iphone12上控制智能家电,可以购买支持Hom...
来源: -
iphone11是双卡双待吗?iphone11强制重启怎么操作?
iphone11是双卡双待吗?iphone11是双卡双待,它采用的是正反双面卡槽设计,您可以通过两张nano-SIM卡来使...
来源: -
iphone12pro屏幕刷新率?iphone12pro的运行内存多大?
iphone12pro屏幕刷新率?iphone12pro的屏幕刷新率为60Hz,其搭载一块6 1英寸的OLED屏幕,分辨率为2532x...
来源:
财富更多》
-
全球观点:中国银行首席研究员郭为民:银行仍需提升数字金融服务能力
中国银行首席研究员郭为民:银行仍需提...
-
全球观点:中国银行首席研究员郭为民:银行仍需提升数字金融服务能力
中国银行首席研究员郭为民:银行仍需提...
-
房企“内保外贷”落地受关注 有望修复海外融资通道
房企“内保外贷”落地受关注有望修复海...
-
港股青岛银行领涨内银股 机构称行业估值系统性提升空间巨大
港股青岛银行领涨内银股机构称行业估值...
-
环球观焦点:提效率、降成本!赣州农商银行真招实招缓解小微企业融资难
提效率、降成本!赣州农商银行真招实招...
动态更多》
热点
- realme10系列正式宣布 采用双曲面屏正面顶部居中挖孔
- 五菱全新微型电动车内饰官图发布 座椅采用星际形打孔工艺
- 努比亚Z40星空典藏版正式开售 采用微米级油画笔触纹理技术
- iQOO11系列正式官宣 首批搭载骁龙8Gen2机型之一
- 海信34英寸带鱼屏显示器发布 支持165Hz刷新率
- OPPO明年将商用240W超级闪充 新一代电芯支持更高倍率充电
- 第一款Android手机渲染图曝光 横向滑盖设计和全尺寸键盘
- 吉利首款纯电皮卡11月9日上市 车辆续航里程超过610公里
- 努比亚Z40SPro星空典藏版正式公布 堪称窄边框天花板
- vivo无线运动耳机2今日正式上市 首销只要119元
- oppo手机来电秀怎么关掉?oppo手机的游戏空间在哪里?
- 小爱同学虚拟形象怎么设置?小爱同学音箱怎么连接手机?
- 怎么关闭苹果小额免密码?苹果手机小额免密支付怎么开通?
- 热点低数据模式怎么关闭?蜂窝网络机型是可以插电话卡吗?
- vivos12pro支持无线充电吗?vivos12pro有红外线功能吗?
- oppo手机怎么关闭乐划锁屏?oppo手机怎么恢复出厂设置?
- 苹果手机防误触怎么设置?苹果手机怎么清理内存垃圾清理?
- 魅族的语音助手叫什么名?魅族手机开不了机怎么办?
- 苹果11访问限制在哪里?苹果11的运行内存是多少?
- 红米k40怎么查电池健康信息?红米k40的屏幕是什么屏幕?
- iphone12人像模式怎么放大?iphone12的home键在哪里?
- 苹果耳机怎么开启降噪呢?苹果耳机老是断线怎么回事?
- switch照片怎么传到手机?switch的免费游戏有哪些?
- 《“十四五”黄河流域生态保护和高质量发展气象保障规划》发布
- 焦点短讯!农民增收有盼头企业入市有奔头 秋粮购销两旺有序推进
- 懂收藏的人,都在悄悄行动!
- 环球简讯:城建发展:将与建发地产合作开发北京生命科学园项目
- 全球最新:CPI超预期降温也不够!IMF:FED须在通胀问题上“坚持到底”
- 当前简讯:河池 “气象+政务云”提升气象服务成效
- 2亿年前蝈蝈嗓门有多高?化石研究得出答案
- 一键身临“奇”境 感受生物多样性之美
- 最资讯丨知名对冲基金与华尔街分析师均看好 这三只美股有何魅力?
- 日本太空创企ispace发射世界首个商业登月舱
- 【当前独家】市值一度跌破5000亿美元 特斯拉(TSLA.US)万亿美元梦渐行渐远
- 世界快报:英特尔13代酷睿非k处理器cinebench测试曝光
- 探日卫星“夸父一号”最新太阳观测科学图像发布
- 每日精选:ST交投(002200.SZ)聘任唐家财为财务总监
- 源杰科技(688498):披露网上发行中签结果
- 世界消息!茂名启动本外币合一银行结算账户体系试点
- 观天下!哈萨克斯坦准备向德国输送原油 以填补制裁俄罗斯造成的供应缺口
- 【当前热闻】环球市场:美国核聚变点火实验取得关键进展 美国将批准向乌克兰输送爱国者导弹
- 德邦快递CTO殷皓:数字化时代的管理,正从「人为因素驱动」变为「数据驱动」|WISE 2022中国数字化创新高峰论坛
- 最新:重庆首个本外币合一银行账户落地,有效降低企业财务成本
- 多家机构给出“买入”评级 爱奇艺开盘大涨超11%
- 全球今热点:大额增持频现!机构:银行股投资有两大关键词
- 国有商业大行出手作保 房企全球融资已迎转机丨焦点
- 今日报丨九折起拍无人问津 洛阳银行1.04亿股股权遭流拍
- 每日视点!11月券商收到65张罚单 32张剑指投行领域
- 通胀连续两月超预期放缓 美股大幅高开 纳指一度大涨超3%
- 世界微头条丨美联储“嘴替”最新发声:CPI数据公布后 美联储官员们更纠结了
- 小米插线板8位总控版上架:售价34.9元起
- 最新资讯:opporeno5pro+5g开放coloros13 升级
- 全球快资讯:美国11月CPI增速创年内新低!市场激情遐想“美联储停止加息在望”
- 交易员押注:美国CPI数据不会引发外汇市场“巨震”
- 观点:华润信托减持中南文化2151.96万股 持股比例降至5%以下
- 【当前独家】中国中铁:拟发行不超35亿元可续期公司债券
- 环球动态:礼来(LLY.US)重申2022年指引 2023年指引不及预期
- 天天通讯!东湖高新拟申请不超20亿元可续期贷款
- 券商视频运营竞逐,流量变现困境究竟该如何破解
- 辉瑞:预计2030年mRNA疫苗带来的收入超过100亿美元
- 【环球新视野】蓝帆医疗(002382.SZ):拟开展不超7亿元金融衍生品交易
- 大手笔!3000亿化工大白马拟176亿元投建乙烯及高端聚烯烃项目|盘后公告集锦
- 微动态丨小摩:首予Mobileye(MBLY.US)“增持”评级 目标价50美元
- 天天即时看!第三季度香港居民总收入达7927亿元 同比增0.3%
- 当前要闻:linux6.2将不合并amdp-驱动程序epp功能
- 每日报道:山西云时代4案例入选2022年度数字政府案例
- 当前焦点!齐鲁银行(601665.SH):经营范围拟增加“证券投资基金销售”
- 银保监核准一批银行行长、副行长任职资格
- 世界热议:Piper Sandler:增长前景好于预期 上调甲骨文(ORCL.US)目标价至85美元
- 广东本外币合一银行结算账户试点扩围
- 天天即时看!大摩将美股评级下调至低配 明年上半年料苦日子来袭
- 全球热点评!【百强透视】港股海运板块持续反弹,新一轮投资机会已凸显?
- 环球速读:中国发布丨11月份人民币存款增加2.95万亿元 同比多增1.81万亿元
- 环球关注:麻省理工大学开发新型“薄如纸”的太阳能光伏电池
- 和哈弗H9一起穿越雪山是怎样的体验?川西之旅走起!
- Adobe Photoshop 2022 V23.4.1.547 简体中文直装版
- 中铁建15亿元可续期公司债将付息 最高票面利率3.98%
- 【当前热闻】华发集团发行10亿元超短期融资券 期限92日
- 全球热头条丨矿业巨头力拓:锂价将长期保持高位 正积极尝试开发锂项目
- dough推出新款oled游戏显示器
- 全球热讯:实现我国水声定位技术从“学步”到“领跑”
- 每日视点!红酒世界被警告罚款 违反外汇登记管理规定
- 新动态:嘉兴经开区投资集团拟发行1.4亿元超短债融资券 期限270天
- 视点!超亿股股权拍卖无人问津 这家银行“变身”后发展前景如何
- 环球即时:中南文化(002445.SZ):华润信托持股比例降至5%以下
- 天天热消息:常州城建集团拟发行6亿元超短期融资券 期限270日
- 欧米茄:时间有记
- 天天热文:山东禹城:建设高标准农田 助力“吨半粮”创建
- 11月我国新能源汽车继续保持快速增长 月度产销再创新高
- 当前快讯:重磅文章,暗示“野蛮人”的结局……
- 全球报道:欧盟禁令生效第一周 俄罗斯原油出口不减反增 近90%流向亚洲
- 天天时讯:怎么让excel单元格的内容自动换行
- 【独家焦点】高盛将再次裁掉数百名员工,超过常规裁员规模
- 总额7500亿!特别国债 “重出江湖”:收益多少?普通人可以买吗?
- 数据资产证券化迎会计制度基础 数据资产入表更进一步
- 当前速读:前瞻2023年中国经济:增速回升、股汇回暖
- 全球快播:如何删除word中的空白页?
- 热门看点:土耳其“堵船”事件提振航运股 中远海能近三日涨幅近20%
- 环球微资讯!华尔街裁员潮加速!高盛或再裁员数百人
- 英特尔祝贺小米迷你主机发布:双方基于nuc方案共创
- 荣耀v40怎么设置返回键?荣耀v40的屏幕是哪个厂家的?
- 苹果13访问限制在哪里设置?苹果13电池百分比怎么显示?
- 苹果手机怎么做图片压缩包?苹果手机屏幕失灵点不动怎么办?
- iphone怎么看本地文件管理?iphone的密码忘记了怎么办?
- 苹果13pro可以无线充电吗?苹果13pro换电池原装多少钱?
- 苹果手机显示隔空播放怎么关闭?苹果手机突然黑屏打不开怎么办?
- 苹果原相机设置专业模式在哪?苹果原相机镜像怎么关闭?
- oppo手表二维码在哪里找?oppo手表怎么连接苹果手机?
- 苹果原相机设置专业模式在哪?苹果原相机自拍是反的怎么调回来?
- 苹果13充满电闪电会消失吗?苹果13的充电器头是什么样的?
- 苹果重力感应设置在哪?苹果重力感应器坏了怎么看视频?
- oppo怎么看电池寿命百分比?oppo电池健康度怎么看?
- 小米无线鼠标怎么连接电脑?米徒鼠标无线鼠标怎么使用?
- oppo手机助手怎么唤醒?oppo手机助手连接不上手机怎么办?
- 联想笔记本背面logo灯怎么开?联想笔记本电脑黑屏打不开怎么办?
- 小米电暖器怎么连接wifi?小米电暖器的无极功率是什么意思?
- 小米写字板电池如何更换?小米写字板电池如何更换视频?
- 文本效果怎么设置为内置样式?文本效果设置为三维格式怎么设置?
- 小米电视怎么激活小爱同学?小米电视怎么样质量怎么样?
- win10怎么设置护眼绿色背景?win10控制面板在哪里?
- 苹果耳机怎么开启降噪?苹果耳机的语音控制怎么关闭?
- 苹果相册怎么分类管理?苹果相册怎么导入到新手机上?
- 三星手机怎么查激活时间?三星手机语音助手叫什么名字?
- 漫步者蓝牙怎么调双耳模式?漫步者蓝牙耳机电脑搜索不到?
- 笔记本独显直连模式怎么开启?笔记本独显与集显的区别是什么?
- 电脑休眠锁屏密码怎么设置?电脑休眠不关机会对电脑有伤害吗?
- win10护眼模式怎么打开?win10我的电脑图标怎么调出来?
- 小米电饭煲怎么预约煮粥呢?小米电饭煲时间不准怎么调?
- win10锁屏密码怎么设置?win10锁屏后无法唤醒怎么开启?
- windows11我的电脑在哪里打开?windows11任务管理器怎么打开?
- 桌面没有steam图标怎么添加?steam图标在哪个文件夹?
- 手机充电提示音怎么关闭?手机充电提示音怎么设置自定义?
- 抖音发的视频可以删除吗?抖音视频无法保存本地怎么办?
- 拯救者独显直连模式怎么开启?拯救者独显模式和混合模式区别是什么?
- oppo手机显示耳机模式怎么关闭?oppo手机怎么恢复出厂设置?