在头文件 WinUser.h
中,有一部分定义了 SetWindowLong()
的第二个参数的常量。
// ...
#define GWL_WNDPROC (-4)
#define GWL_HINSTANCE (-6)
#define GWL_HWNDPARENT (-8)
#define GWL_STYLE (-16)
#define GWL_EXSTYLE (-20)
#define GWL_USERDATA (-21)
#define GWL_ID (-12)
#ifdef _WIN64
#undef GWL_WNDPROC
#undef GWL_HINSTANCE
#undef GWL_HWNDPARENT
#undef GWL_USERDATA
#endif /* _WIN64 */
#define GWLP_WNDPROC (-4)
#define GWLP_HINSTANCE (-6)
#define GWLP_HWNDPARENT (-8)
#define GWLP_USERDATA (-21)
#define GWLP_ID (-12)
// ...
但是如果定义 _WIN64
,它们就在 undefined 之后;它是在我的 64 位系统中定义的。
如您所见,还有一个 GWLP_***
常量集,但它们没有记录在 SetWindowLong()
的页面中。
为什么这些常量在 x64 系统中未定义?
在 x64 系统中调用 SetWindowLong()
的替代方法是什么?
我的系统:
操作系统:Windows 7 Ultimate x64 SP1
IDE:Visual Studio 2012 终极更新 3
原文由 hkBattousai 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 x64 构建中,某些窗口数据值(例如,指的是像窗口过程这样的“指针大小”对象)需要是 64 位的。 The old
SetWindowLong()
andGetWindowLong()
functions are limited toDWORD
sized (32 bit) values for backwards compatibility, and Microsoft have introduced new versions,SetWindowLongPtr()
和GetWindowLongPtr()
允许您使用指针大小的值(在 32 位构建中为 32 位,在 64 位构建中为 64 位)。现在建议您始终使用
SetWindowLongPtr()
和GWLP_xxx
常量,无论您是为 32 位还是 64 位构建,但在 64 位构建中您 需要 使用新功能因此定义是#undefined 会导致构建错误,从而迫使您修复代码。