之前我们在几篇文章中描述了如何进行”思想”调试,今天的文章我将不会这样做。
因为下面的编程错误大部分人都会遇到,如果你看一眼下面的代码,你不会发现有什么问题,这仅仅是因为你的的大脑只给你希望看到的,而不是那些真实存在的东西。(有没有一种黑客帝国的感觉?)
>> 请移步至 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》