文章图片
如果你阅读一些比较古老的代码 , 则你会发现像下图这样类型的转换 , 看起来好像没什么必要:
为什么这里的”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?》
- iPad|iPadmini6从发售之日起,果冻屏现象就一直有,那为什么会出现这种现象?
- oled屏幕|为什么总有人说OLED屏幕伤眼?为什么有人非LCD屏幕手机不用?
- 阿里巴巴|阿里被罚182亿!腾讯为什么至今安然无恙?
- Windows11|Windows 11版“您的手机”应用将更新! 任务栏新功能截图曝光
- Windows11|麒麟990+5G+鸿蒙系统,华为旗舰跌至新低,花粉:幸福来得太突然
- Windows11|三星用户有福了?发布会文件遭泄密,新机提供4个安卓版本更新!
- 程序员|为什么程序员会有代码能跑就不要动的观点?是有毒吗?还是怎样?
- 飞利浦|如何在 MacOS 和 Windows 上捕捉窗口
- 华为|终于明白为什么越来越多的华为老用户,换手机时,不愿考虑华为了
- |一部手机用了三年以上是什么感受,你为什么舍不得换机呢?