VC2005のSetWindowLongPtr()

[戻る]
K 2006/07/30(日) 19:57:39
VC2005で、SetWindowLongPtr()の第3パラメータに
LONG_PTRの変数を渡すと、なぜか以下の警告が出ます。

・LONG_PTRからLONGに切り詰めます・・・


F12で定義を追っていくと、以下のようになってました。

typedef _W64 long LONG_PTR, *PLONG_PTR;
#define SetWindowLongPtrA   SetWindowLongA

Win32やコンソールアプリだと警告が出て、
ATLプロジェクトだと出ません。
警告を回避できるようなプリプロセッサ定義はあるのでしょうか?


LONG_PTR SetWindowLongPtr(
  HWND hWnd,           // ウィンドウのハンドル
  int nIndex,          // 変更する値のオフセット
  LONG_PTR dwNewLong   // 新しい値
);

Ban 2006/07/30(日) 20:20:15
Win64環境ではLONG_PTRは64bitあります。
LONGは32bitなので、ポインタなどを格納すると情報が落ちてしまいます。

出ているのはこの警告です。

プリプロセッサ定義ではなく、プロジェクトのコンパイルオプションに
64ビット移植への対応項目がありませんか。

K 2006/07/31(月) 21:40:44
[[解決]]
>64ビット移植への対応項目がありませんか。
あります。
デフォルトで、64bit移植への対応がON(/Wp64)になっています。

/Wp64がONの時のLONG_PTRの定義を追っていくと、最終的に
__w64 long
となっていました。

MSDNよると、__w64は64bitコンパイラでコンパイルしたかのように
警告を出すオプションだそうです。
警告が出るだけで、32bitコンパイラでは32bitのままのようです。

SetWindowLongPtr()は、32/64bitでのコード移植性のために
SetWindowLong()を置き換えたもののはずなので、
警告が出るのはおかしいと思うのですが・・・
ちなみに、/Wp64をOFFにしても警告は出ました。


MSDNより抜粋
Lets you mark variables, such that when you compile with /Wp64 the compiler 
will report any warnings that would be reported if you were compiling with a 
64-bit compiler.

古いスレッドには追加発言できません。