[英]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.