[英]How do I call SetWindowLong() in the 64-bit versions of Windows?
在头文件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 Ultimate Update 3
在 x64 构建中,某些窗口数据值(例如,引用“指针大小”对象,如窗口过程的那些)需要为 64 位。 为了向后兼容,旧的SetWindowLong()
和GetWindowLong()
函数仅限于DWORD
大小(32 位)的值,并且 Microsoft 推出了新版本SetWindowLongPtr()
和GetWindowLongPtr()
允许您使用指针大小的值(32 位)位在 32 位构建中,64 位在 64 位构建中)。
这些天建议您始终使用SetWindowLongPtr()
和GWLP_xxx
常量,无论您是为 32 位还是 64 位构建,但在 64 位构建中您需要使用新函数,因此定义为 #undefined 以导致构建迫使您修复代码的错误。
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
还要确保您没有定义以下内容:
#define NOWINOFFSETS
这使得GWL_*
, GCL_*
,即。 GetWindowLongPtr
和系列,以及可用的相关例程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.