Как мне вызвать 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

12

Решение

Некоторые значения данных окна (те, которые ссылаются на объекты «размером с указатель», такие как, например, процедура окна), должны быть 64-битными в сборке x64. Старый SetWindowLong() а также GetWindowLong() функции ограничены DWORD размерные (32-битные) значения для обратной совместимости, и Microsoft представила новые версии, SetWindowLongPtr() а также GetWindowLongPtr() которые позволяют вам работать со значениями указателя (32-разрядная в 32-разрядной сборке и 64-разрядная в 64-разрядной сборке).

В эти дни рекомендуется всегда использовать SetWindowLongPtr() и GWLP_xxx константы, будь то сборка для 32 или 64-битной, но в 64-битной сборке вы необходимость использовать новые функции и поэтому определения #undefined вызывают ошибки сборки, которые вынуждают вас исправлять свой код.

29

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]