首页 > 代码库 > MSDN中关于SetWindowLongPtr和GetWindowLongPtr函数的描述错误

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对应起来。这样以来,还是会造成不小的困扰。

??

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