ヘッダーファイルには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)
// ...
しかし、それらは、定義されている場合は undefined の直後にあり_WIN64
、私の 64 ビット システムでは定義されています。
ご覧のとおり、GWLP_***
定数のセットもありますが、 のページには文書化されていませんSetWindowLong()
。
これらの定数が x64 システムで未定義なのはなぜですか? x64 システムで
呼び出す別の方法は何ですか?SetWindowLong()
私のシステム:
OS: Windows 7 Ultimate x64 SP1
IDE: Visual Studio 2012 Ultimate Update 3
ベストアンサー1
一部のウィンドウ データ値 (たとえば、ウィンドウ プロシージャなどの「ポインタ サイズ」のオブジェクトを参照するもの) は、x64 ビルドでは 64 ビットである必要があります。古い関数SetWindowLong()
とGetWindowLong()
関数は、下位互換性のためにサイズ指定 (32 ビット) された値に制限されていますDWORD
が、Microsoft は新しいバージョンとを導入し、SetWindowLongPtr()
ポインタGetWindowLongPtr()
サイズの値 (32 ビット ビルドでは 32 ビット、64 ビット ビルドでは 64 ビット) を操作できるようになりました。
最近では、32ビットまたは64ビットのビルドのどちらであっても、常に定数を使用することが推奨されていますが、64ビットビルドでSetWindowLongPtr()
はGWLP_xxx
必要新しい関数を使用するには、定義が #undefined になり、ビルド エラーが発生してコードの修正が必要になります。