如何在 64 位版本的 Windows 中调用 SetWindowLong()?

新手上路,请多包涵

在头文件 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 许可协议

阅读 1.3k
1 个回答

在 x64 构建中,某些窗口数据值(例如,指的是像窗口过程这样的“指针大小”对象)需要是 64 位的。 The old SetWindowLong() and GetWindowLong() functions are limited to DWORD 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 会导致构建错误,从而迫使您修复代码。

原文由 Jonathan Potter 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题