【问题标题】:How do I call SetWindowLong() in the 64-bit versions of Windows?如何在 64 位版本的 Windows 中调用 SetWindowLong()?
【发布时间】:2013-08-13 06:30:11
【问题描述】:

在头文件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,它们就在未定义之后;它是在我的 64 位系统中定义的。

如您所见,还有一组GWLP_*** 常量,但它们没有记录在SetWindowLong() 的页面中。

为什么这些常量在 x64 系统中未定义?
在 x64 系统中调用 SetWindowLong() 的替代方法是什么?


我的系统:
操作系统:Windows 7 Ultimate x64 SP1
IDE:Visual Studio 2012 Ultimate Update 3

【问题讨论】:

  • 文档顶部的右侧是 注意此函数已被 SetWindowLongPtr 函数取代。要编写与 32 位和 64 位版本的 Windows 兼容的代码,请使用 SetWindowLongPtr 函数。
  • @chir 我在问题中给出的文档页面中找不到该注释。
  • 我猜移动版的文档不包括注释。

标签: c++ winapi 64-bit setwindowlong


【解决方案1】:

还要确保您没有定义以下内容:

#define NOWINOFFSETS

禁用GWL_*GCL_*,即。 GetWindowLongPtr 和家人,以及相关的例程。

【讨论】:

    【解决方案2】:
        As specified in <WinUser.h>
        //If config is _WIN64 then use new versioned macro
    
        #define GWLP_WNDPROC        (-4)
        #define GWLP_HINSTANCE      (-6)
        #define GWLP_HWNDPARENT     (-8)
        #define GWLP_USERDATA       (-21)
        #define GWLP_ID             (-12)
    
        //else for _WIN32
    
        #undef GWL_WNDPROC
        #undef GWL_HINSTANCE
        #undef GWL_HWNDPARENT
        #undef GWL_USERDATA
    

    【讨论】:

      【解决方案3】:

      在 x64 构建中,某些窗口数据值(例如,指的是像窗口过程这样的“指针大小”对象)需要是 64 位的。旧的SetWindowLong()GetWindowLong() 函数仅限于DWORD 大小(32 位)的值以实现向后兼容性,Microsoft 推出了新版本SetWindowLongPtr()GetWindowLongPtr(),允许您使用指针大小的值(32 位构建为 32 位,64 位构建为 64 位)。

      现在建议您始终使用SetWindowLongPtr()GWLP_xxx 常量,无论您是为 32 位还是 64 位构建,但在 64 位构建中,您需要使用新函数,因此定义是#undefined,会导致构建错误,迫使您修复代码。

      【讨论】:

      • 我遇到了这个问题,这个答案帮助了我。谢谢!
      • 在 GWL_STYLE 和 GWL_EXSTYLE 上使用 GetWindowLong/SetWindowLong 是否无害,因为它们从不超过 32 位数据?
      • @William 是的,没关系。
      猜你喜欢
      • 2011-01-20
      • 2012-03-06
      • 2014-09-07
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      相关资源
      最近更新 更多