23

在头文件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)

// ...

但是它们紧跟在未定义的 if_WIN64定义之后;它是在我的 64 位系统中定义的。

如您所见,还有一GWLP_***组常量,但它们没有记录在SetWindowLong().

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


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

4

3 回答 3

49

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

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

于 2013-08-12T02:09:58.300 回答
1

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

#define NOWINOFFSETS

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

于 2021-01-06T20:28:55.233 回答
1
    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
于 2020-09-23T07:07:04.087 回答