Windows|为什么需要对LPARAM进行不必要的转换?


Windows|为什么需要对LPARAM进行不必要的转换?

文章图片


Windows|为什么需要对LPARAM进行不必要的转换?

如果你阅读一些比较古老的代码 , 则你会发现像下图这样类型的转换 , 看起来好像没什么必要:

为什么这里的”string”需要转换为LPSTR呢?它本身已经是一个LPSTR了 , 为什么还要转换一次?
这个是16位Windows的遗留产物 。 在16位Windows上 , 指针在默认情况下是近指针 。 所以 , ”string”就是一个指向字符串的近指针 , 如果你像下图这样写代码:

系统会尝试将一个近指针转换为一个long类型 。 因为近指针是一个16位的值 , 所以这个指针将会被0扩展至一个32位的值(因为long是一个32位的值) 。
然而 , 在Windows消息体系中 , 所有的指针都必须是一个远指针 , 因为窗口的窗口过程函数可能会在另一个和消息发送至完全不同的模块中实现 。 还记得上一篇文章吗 , 一个近指针将会被解析为相对于默认段的偏移 , 而每一个模块的默认段都是不同的 。 将一个近指针发送给另一个模块 , 将会导致该指针被解析为相对于接收者模块的默认段 , 这就不再是发送者模块中的默认段了 。
上面第一张图中的LPSTR转换 , 会将以近指针转换为一个远指针 , 这里的LP是一个匈牙利命名法的前缀 , 表明它是一个远指针(Long Pointers) 。 将一个近指针转换为一个远指针 , 将会插入一个预先定义的默认段 , 所以后续的LPARAM转换将会形成一个完整的16位:16位格式的远指针 。
【Windows|为什么需要对LPARAM进行不必要的转换?】你是不是应该庆幸 , 在现在的这个年代 , 不需要关心这些繁琐的细节了?
总结从16位操作系统过渡到32位系统的过程 , 包含了很多技术革新 。 拥有一个高质量的操作系统模型 , 让我们这些应用开发者也更加省心了 。 扎西德勒!
感受就是:多(可供调用的API多) , 快(IDE帮你快速写码) , 好(开发文档写的不错) , 省(上文中所说的繁文缛节) 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Why do I sometimes see redundant casts before casting to LPARAM?》