一天一个小技巧:善用 WM_NCDESTROY 消息

一天一个小技巧:善用 WM_NCDESTROY 消息

作者:BlogUpdater |  时间:2024-05-17 |  浏览:609 |  评论已关闭 条评论

某天,一个客户请求我的帮助,他们直接发送了下面的调用堆栈:

有了这个,事儿就好办了。如果你明白窗口销毁的过程,则你应该能明白程序异常的原因。

主要问题在于,树控件(TreeView Control)尝试使用一个已经不再有效的图像列表(Image List),它不再有效的原因可能是它已经被销毁了。

如果我们再次深入研究下这个调用堆栈,则你会发现:树控件自己也正在被销毁。

你可以从名称为 TV_DestroyTree 的函数中推断出这一点,或者如果你查看参数(为了简洁起见,我从堆栈跟踪中删除了这些参数),你会看到这样一条消息:WM_DESTROY。

解决问题的下一步是:弄清楚是谁在图像列表仍在使用时销毁了它。客户分享了他们的源代码,稍加探索就会发现,正是这个功能破坏了图像列表:

现在,所有线索都摆在了桌面上,请使用你出色的推理能力来理解哪里出了问题。

总结

小技能 GET:WM_NCDESTROY 是窗口将收到的最后一条消息(在没有奇怪的情况下),因此它是进行”最终清理”的最佳位置。这就是为什么我们要等到收到 WM_NCDESTROY 时才销毁其实例变量,而不是 WM_DESTROY。

最后

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

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(TopomelBox)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

标签:

评论已关闭。