MSDN中关于SetWindowLongPtr和GetWindowLongPtr函数的描述错误

1 这两个函数的历史

SetWindowLongPtr()和GetWindowLongPtr()这一对API是用来存取窗口对象中的特定数据块的,这也是用来取代SetWindowLong()和GetWindowLong()这对过时API的。不带Ptr结尾API过时的原因在于无法适应64位平台,而本文要指出的MSDN中存在的问题也就在于没有及时更新来适应64平台的情况。

2 错误所在

下面摘自MSDN官方网站(2015年1月13日)。

LONG_PTR WINAPI SetWindowLongPtr(
  _In_  HWND hWnd,
  _In_  int nIndex,
  _In_  LONG_PTR dwNewLong
);
nIndex  [in]

Type: int

The zero-based offset to the value to be set. Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer. To set any other value, specify one of the following values.


这两个函数要想存取窗口对象额外数据,就必须在RegisterClass()时,通过WNDCLASS.cbWndExtra来申请附加字节。参数nIndex在函数用来读写窗口对象附加数据时,指的是从附加数据块的第nIndex个字节开始读写sizeof(LONG_PTR)个字节。所以其是否合法取决于从nIndex开始的sizeof(LONG_PTR)个字节是否全部位于窗体对象的附加数据块内。也就是0到(extra window memory)-sizeof(LONG_PTR)。而MSDN却简单的把它写成了0到(extra window memory)-sizeof(int)。

对于32位程序来说,sizeof(LONG_PTR) == sizeof(int),MSDN的描述是没有问题的。然而,对于64位程序,sizeof(LONG_PTR)=8,而sizeof(int)=4,两者不再相等。

也许MSDN此处的单词 integer 指的是依赖平台的整数,但是大多数程序员会把此处的integer和C/C++语言里的int对应起来。这样以来,还是会造成不小的困扰。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值