2012-02-14 20 views
4
私は次のコードを使用してい

SetWindowLong関数/ GetWindowLongと32ビット/ 64ビットのCPU

const int GWL_STYLE = (-16); 

const UInt32 WS_POPUP = 0x80000000; 
const UInt32 WS_CHILD = 0x40000000; 

[DllImport("user32.dll", SetLastError = true)] 
static extern UInt32 GetWindowLong(IntPtr hWnd, int nIndex); 

[DllImport("user32.dll")] 
static extern int SetWindowLong(IntPtr hWnd, int nIndex, UInt32 dwNewLong); 

とどこかを...

SetWindowLong(this.Handle, GWL_STYLE, 
      ((GetWindowLong(this.Handle, GWL_STYLE) & ~(WS_POPUP)) | WS_CHILD)); 

ウィル両方32に適切にこの実行bitと64-bitのマシン?

私のアプリケーションをx86プロセスとしてコンパイルしても、64ビットマシンで正常に動作しますか?

32ビットマシンと64ビットマシンの両方で次のコードをOKに書き換えるにはどうすればよいですか?

+2

[32ビットプラットフォームでGetWindowLongPtrとSetWindowLongPtrをどのようにピンボケしますか?](http://stackoverflow.com/questions/3343724/how-do-i-pinvoke-to-getwindowlongptr-and-setwindowlongptr 32ビットプラットフォーム上)Hansの答えはいつも優れており、スポット・オンです。 –

+0

[32ビットプラットフォームでGetWindowLongPtrとSetWindowLongPtrをどのようにピンボケしますか?](https://stackoverflow.com/questions/3343724/how-do-i-pinvoke-to-getwindowlongptr-and-setwindowlongptr-on -32ビットプラットフォーム) –

答えて

3

UInt32タイプを正しく選択したかどうか疑問に思うでしょう。答えは「はい」です。ドキュメントは明示的に常に32ビットの値であると明示しています。http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx

コードは正しいです。

+3

右記のようにも書かれています:* "** Note **この関数は、' SetWindowLongPtr'関数に取って代わりました.32ビットと64ビットの両方のバージョンと互換性のあるコードを書くには* SetWindowLong'の宣言を得るだけでは、64ビットバージョンのWindowsでは正しくありません。 –

+0

SetWindowLongは、正式にポインタサイズのもの(例:ウィンドウプロシージャ)を渡さない限り、64ビットプラットフォームでも正常に動作します。 – ChrisV

+1

@Chris:そうですが、 'SetWindowLong'関数はポインタのようなものを渡すために*頻繁に使用されています...コードを正しく書いて、心配する必要はありません後で同じ定義を再利用することに決めた時点で、今度はポインタを渡します。 –

関連する問題