Как мне вызвать SetWindowLong() в 64-битных версиях 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
определено; и это определено в моей 64-битной системе.
Как видите, есть также GWLP_***
набор констант, но они не задокументированы на странице SetWindowLong()
,
Почему эти константы не определены в системах x64?
Какой альтернативный способ звонка SetWindowLong()
в системах x64?
Моя система:
ОС: Windows 7 Ultimate x64 SP1
IDE: Visual Studio 2012 Ultimate, обновление 3
3 ответа
Некоторые значения данных окна (те, которые ссылаются на объекты "размером с указатель", такие как, например, процедура окна), должны быть 64-битными в сборке x64. Старый SetWindowLong()
а также GetWindowLong()
функции ограничены DWORD
размерные (32 битные) значения для обратной совместимости, и Microsoft представила новые версии, SetWindowLongPtr()
а также GetWindowLongPtr()
которые позволяют вам работать со значениями указателя (32-битная в 32-битной сборке и 64-битная в 64-битной сборке).
В эти дни рекомендуется всегда использовать SetWindowLongPtr()
и GWLP_xxx
константы, будь то сборка для 32 или 64 бит, но в 64 битной сборке вам нужно использовать новые функции и поэтому определения #undefined вызывают ошибки сборки, которые вынуждают вас исправлять ваш код.
Также убедитесь, что вы НЕ определяете следующее:
#define NOWINOFFSETS
который отключает
GWL_*
,
GCL_*
, т.е.
GetWindowLongPtr
и семья, а также связанные с ними рутины.
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