64 ビット版の Windows で SetWindowLong() を呼び出すにはどうすればいいですか? 質問する

64 ビット版の Windows で SetWindowLong() を呼び出すにはどうすればいいですか? 質問する

ヘッダーファイルにはWinUser.hSetWindowLong()定義されています。

// ...

#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 になり、ビルド エラーが発生してコードの修正が必要になります。

おすすめ記事