请注意:本页内容发布于 1719 天前,内容可能已经过时,请注意甄别。
原文链接:https://devblogs.microsoft.com/oldnewthing/20041019-00/?p=37533
The Listview control when placed in report mode has a child header control which it uses to display column header titles. This header control is the property of the listview, but the listview is kind enough to let you retrieve the handle to that header control.
当Listview控件置于报表模式下时,其内有一个表头控件,用来展示列标题。这个表头控件是属于Listview的“私有财产”,不过Listview很大方,允许你去获取这个表头空间的句柄。
And some programs abuse that kindness.
而有些应用程序就滥用了这种大方。
It so happens that the original listview control did not use the lParam of the header control item for anything. So some programs said, “Well, if you’re not using it, then I will!” and stashed their own private data into it.
凑巧,原始版本的Listview没有使用这个表头控件的lParam,这时个别程序就决定,『你不用的话,我就用一下好了!』然后将其内部数据塞了进去。
Then a later version of the listview decided, “Gosh, there’s some data I need to keep track of for each header item. Fortunately, since this is my header control, I can stash my data in the lParam of the header item.”
后续版本的Listview做了个决定:『哎呀,这些个表头有些数据我得跟踪监视,不过还好,这个表头控件是属于我的,只要把数据藏进lParam里去修好了。』
And then the application compatibility team takes those two ingredients (the program that stuffs data into the header control and the listview that does the same) to their laboratory, mixes them, and an explosion occurs.
后来,应用程序兼容性团队把这两种成分(把私有数据塞进表头控件里的应用、和同样这样做的Listview)带进了实验室,将二者混合,然后就炸了。
After some forensic analysis, the listview development team figures out what happened and curses that they have to work around yet another program that grovels into internal data structures. The auxiliary data is now stored in some other less convenient place so those programs can continue to run without crashing.
经过一番正经八百的论证,Listview控件的开发团队找到了问题的原因,并选择在这又一个随便挖进内部数据结构的应用程序面前退让一步。前面提到的辅助数据现在被放进了不太容易被乱来的地方,这样那个乱改(Listview)内部数据的程序就能继续运行而不崩溃了。
The moral of the story: Even if you change something that nobody should be relying on, there’s a decent chance that somebody is relying on it.
故事的寓意是:即便你修改了别人不该依赖的位置,还是有相当的可能有人是依赖它的。
(I’m sure there will be the usual chorus of people who will say, “You should’ve just broken them.” What if I told you that one of the programs that does this is a widly-used system administration tool? Eh, that probably wouldn’t change your mind.)
(我敢肯定肯定又有很多人要说,『别管那家伙不就好了』,要是我告诉你这样做的程序之一是某个被广泛使用的系统管理工具呢?不过,这大概也不会让你收回前言吧。)
远嚣 Comment