2013-08-12 27 views
9

ヘッダファイルWinUser.hには、第2パラメータの定数がSetWindowLong()と定義されている部分があります。64ビットバージョンのWindowsで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の究極のx64 SP1
IDE:Visual Studioの2012アルティメットアップデート3

+1

ドキュメントの先頭にあります。注:この関数は、SetWindowLongPtr関数に取って代わりました。 * Windowsの32ビット版と64ビット版の両方に互換性のあるコードを書くには、SetWindowLongPtr関数を使用してください。* – chris

+0

@chir私の質問に書かれたドキュメントページでそのメモを見つけることができません。 – hkBattousai

+0

ドキュメントのモバイル版にはノートが含まれていないと思います。 – chris

答えて

22

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

これらの日は、あなたが32または64ビットのために構築されているかどうか、あなたは常にSetWindowLongPtr()GWLP_xxx定数を使用することをお勧めしますが、64ビットであなたを構築新しい機能を使用する必要ので、定義が#ありさコードを修正するためのビルドエラーが発生する可能性があります。

関連する問題