之前我们在几篇文章中描述了如何进行“思想”调试,我不会在今天的文章中这样做。
因为我们大多数人都会遇到以下编程错误,如果你看一下下面的**,你不会发现任何错误,仅仅是因为你的大脑只给你你想看的东西,而不是真实的东西。 (黑客帝国有感觉吗? )
您可以长时间盯着这一段,而完全忽略错误的窗口句柄被传递给 getdlgitem 和 setwindowlongptr。
WM 通知消息的 hwndfrom 是生成通知的窗口; 在本例中,PSN QueryInitialFocus 是从“属性表框架”窗口生成的。 但是,对话消息的结果需要存储在接收消息的对话框中的额外字节中,而不是存储在发送消息的对话框中。
调用 getdlgitem 时,窗口管理器在作为第一个参数传递的窗口的子项中搜索控件,但在这里,IDC MyControl 是属性表页的子项,而不是属性表框架。
正确的 ** 应该是:setWindowLongPtr(HDLG, dwlp msgresult, (lparam)getDLGITEM(hdlg, IDC MyControl));
这种因为大脑向你展示你想看到的东西(而不是实际存在的东西)而错过了显而易见的东西的现象,这让我想起了我的一个同事把我叫到他的办公室,帮助弄清楚为什么他的一个循环只迭代了一次。
他调出屏幕上的功能并告诉我。 “好的,现在变量已经为循环设置好了,所以虽然我们还没有找到条目,但我们将从列表中抓取下一个项目......”
我迟疑地打断了他。 “嗯,'虽然'? *它说“如果”。
啊。 好吧,没关系。 这里没什么可看的。 现在继续前进。 ”
这与你希望别人校对你的文章的原因相同。 既然你写了,你的大脑会告诉你你想写什么,不一定是你实际写的。
总结。 在很多情况下,我们需要完全消除主观的想象,因为这些想象可能与事实完全相反。 所以:根据事实的发展做出决定,而不是根据想象。
最后。 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》