2012-02-14 93 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 - 這正常運行位和64位機器?

如果沒有,如果我編譯我的應用程序作爲x86進程運行,它仍然可以在64位機器上正常工作嗎?

如何在32位和64位計算機上重寫以下代碼以確定?

+2

可能的重複[如何在32位平臺上調用GetWindowLongPtr和SetWindowLongPtr?](http://stackoverflow.com/questions/3343724/how-do-i-pinvoke-to-getwindowlongptr-and-setwindowlongptr在32位平臺上)漢斯的回答非常好,並且通常都是點亮的。 – 2012-02-14 21:01:13

+0

可能的重複[如何在32位平臺上調用GetWindowLongPtr和SetWindowLongPtr?](https://stackoverflow.com/questions/3343724/how-do-i-pinvoke-to-getwindowlongptr-and-setwindowlongptr-on -32位平臺) – 2017-07-21 13:21:36

回答

3

我想你想知道你是否正確選擇了類型UInt32。答案是肯定的。該文檔明確指出它總是32位值:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx

您的代碼是正確的。

+3

正確,但它也表示:*「** Note **此函數已被SetWindowLongPtr函數取代。要編寫兼容32位和64位版本的代碼的Windows中,使用'SetWindowLongPtr'函數。「*因此,僅僅爲SetWindowLong聲明正確對於64位版本的Windows是不夠的。 – 2012-02-14 21:00:37

+0

SetWindowLong在64位平臺上仍然可以正常工作,只要不傳遞正式指針大小的任何東西(例如,窗口過程)。 – ChrisV 2012-02-14 21:04:05

+1

@Chris:是的,但是'SetWindowLong'函數經常被用來傳遞指針等東西......第一次正確編寫代碼似乎是一個更好的主意,所以你不必擔心關於它稍後當你決定重用相同的定義,但這次傳遞一個指針。 – 2012-02-14 21:09:35