23

ヘッダーファイルWinUser.hには、第2引数の定数を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 システムで定義されていないのはなぜですか? x64 システム
で呼び出す別の方法は何ですか?SetWindowLong()


私のシステム:
OS: Windows 7 Ultimate x64 SP1
IDE: Visual Studio 2012 Ultimate Update 3

4

3 に答える 3

49

x64 ビルドでは、一部のウィンドウ データ値 (たとえば、ウィンドウ プロシージャのような「ポインター サイズ」のオブジェクトを参照する値) は 64 ビットである必要があります。古い関数SetWindowLong()と関数は、下位互換性のためにサイズ指定された (32 ビット) 値にGetWindowLong()制限されています。Microsoft は新しいバージョンを導入し、ポインター サイズの値 (32 ビット ビルドでは 32 ビット、64 ビット ビルドでは 64 ビット) を操作できるようにしました。ビットビルド)。DWORDSetWindowLongPtr()GetWindowLongPtr()

最近では、32 ビットまたは 64 ビットのどちらでビルドする場合でも、常に定数を使用することをお勧めしますSetWindowLongPtr()GWLP_xxx、64 ビット ビルドでは新しい関数を使用する必要があるため、定義が #undefined でビルド エラーが発生し、強制的にビルド エラーが発生します。コードを修正します。

于 2013-08-12T02:09:58.300 に答える
1

また、次を定義していないことを確認してください。

#define NOWINOFFSETS

つまり、を無効GWL_*にしますGCL_*GetWindowLongPtrと家族、および関連するルーチン。

于 2021-01-06T20:28:55.233 に答える