Как мне вызвать 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
Другие вопросы по тегам