В заголовочном файле 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
Некоторые значения данных окна (те, которые ссылаются на объекты «размером с указатель», такие как, например, процедура окна), должны быть 64-битными в сборке x64. Старый SetWindowLong()
а также GetWindowLong()
функции ограничены DWORD
размерные (32-битные) значения для обратной совместимости, и Microsoft представила новые версии, SetWindowLongPtr()
а также GetWindowLongPtr()
которые позволяют вам работать со значениями указателя (32-разрядная в 32-разрядной сборке и 64-разрядная в 64-разрядной сборке).
В эти дни рекомендуется всегда использовать SetWindowLongPtr()
и GWLP_xxx
константы, будь то сборка для 32 или 64-битной, но в 64-битной сборке вы необходимость использовать новые функции и поэтому определения #undefined вызывают ошибки сборки, которые вынуждают вас исправлять свой код.
Других решений пока нет …