如果你找不到东西,请先确保你在正确的地方寻找

之前我们在几篇文章中描述了如何进行”思想”调试,今天的文章我将不会这样做。

因为下面的编程错误大部分人都会遇到,如果你看一眼下面的代码,你不会发现有什么问题,这仅仅是因为你的的大脑只给你希望看到的,而不是那些真实存在的东西。(有没有一种黑客帝国的感觉?)

>> 请移步至 www.topomel.com 以查看图片 <<

您可以长时间盯着看这段代码,而完全忽略了错误的窗口句柄被传递给 GetDlgItem 和 SetWindowLongPtr。

WM_NOTIFY 消息的 hwndFrom 是生成通知的窗口;在本例中,PSN_QUERYINITIALFOCUS是从“属性表框架”窗口生成的。但是,对话消息的结果需要存储在接收消息的对话框的额外字节中,而不是存储在发送消息的对话中。

调用 GetDlgItem 时,窗口管理器会在作为第一个参数传递的窗口的子级中搜索控件,但在这里,IDC_MYCONTROL 是属性表页的子级,而不是属性表框架。

正确的代码应为:
SetWindowLongPtr(hdlg, DWLP_MSGRESULT, (LPARAM)GetDlgItem(hdlg, IDC_MYCONTROL));

这种因为大脑向你展示你想看到的东西(而不是实际存在的东西)而错过了显而易见的东西的现象,这让我想起了有一次我的一位同事把我叫到他的办公室,帮助弄清楚为什么他的一个循环只迭代了一次。

他在屏幕上调出这个功能,并告诉我。“好了,现在变量已经为循环设置好了,所以虽然我们还没有找到条目,但我们从列表中抓取下一项……”

我迟疑地打断了他。“嗯,’虽然’?代码上写着’if’。

“哎呀。嗯,没关系。这里没什么可看的。现在继续前进。”

这与你想让别人校对你的文章的原因相同。既然你写了它,你的大脑就会告诉你你想写什么,不一定是你实际写的东西。

总结

在许多场景下,我们需要完全去除主观想象,因为这些想象可能和事实完全相反。
所以:根据事实的发展,做出决定,而不是靠想象。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Non-psychic debugging: If you can’t find something, make sure you’re looking in the right place》

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拓扑梅尔-漫漫开发路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值