C# SetWindowLong/GetWindowLong和32位/64位CPU

C# SetWindowLong/GetWindowLong和32位/64位CPU,c#,winapi,64-bit,pinvoke,32-bit,C#,Winapi,64 Bit,Pinvoke,32 Bit,我正在使用以下代码: 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")] s

我正在使用以下代码:

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位机器上重写以下代码使其正常运行?

我想您可能想知道您是否正确选择了UInt32类型。答案是肯定的。文档明确表示它始终为32位值:


您的代码是正确的。

正确,但它也说明:“注意此函数已被
SetWindowLongPtr
函数取代。要编写与32位和64位版本的Windows兼容的代码,请使用
SetWindowLongPtr
函数。”因此,对于64位版本的Windows来说,仅仅获得
SetWindowLong
的声明是不够的。只要不传递任何官方指针大小的东西(例如,窗口过程),SetWindowLong在64位平台上仍然可以正常工作。@Chris:是的,但是,
SetWindowLong
函数经常用于传递指针之类的信息。。。第一次正确地编写代码似乎是一个更好的主意,这样以后决定重用同一定义时就不必担心了,但这次要传递一个指针。@CodyGray:SetWindowLongPtr是32位平台上的宏,因此您在尝试P/调用它时不会走得太远。@CodyGray:“要编写与32位和64位版本的Windows兼容的代码,请使用SetWindowLongPtr函数”。我认为,如果有人在C#/pinvoke线程中读到这段引语,并认为这是对C#/pinvoke的一个很好的建议,那么这并不是一种延伸。尽管你没有这样做,但很容易被误解(显然是克里斯夫写的)。汉斯的答案的可能复本很好,而且通常都是准确无误的