SetWindowLong/GetWindowLong和32位/ 64位CPU

Żub*_*wka 6 c# 64-bit pinvoke winapi 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")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, UInt32 dwNewLong);
Run Code Online (Sandbox Code Playgroud)

在某个地方......

SetWindowLong(this.Handle, GWL_STYLE,
             ((GetWindowLong(this.Handle, GWL_STYLE) & ~(WS_POPUP)) | WS_CHILD));
Run Code Online (Sandbox Code Playgroud)

这会在32位和64位机器上正常运行吗?

如果没有,如果我编译我的应用程序作为x86进程运行,它仍然可以在64位计算机上正常工作吗?

如何在32位和64位计算机上重写以下代码?

usr*_*usr 5

我想你想知道你是否正确选择了UInt32类型.答案是肯定的.文档明确表示它总是32位值:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v = vs.85).aspx

你的代码是正确的.

  • 是的,但它也说:*"**注意**此函数已被`SetWindowLongPtr`函数取代.要编写与32位和64位版本的Windows兼容的代码,请使用`SetWindowLongPtr`函数."*因此,简单地获取`SetWindowLong`的声明对于64位版本的Windows是不够的. (3认同)
  • @Chris:是的,但是`SetWindowLong`函数*经常*用于传递指针之类的东西......第一次正确编写代码似乎是一个更好的主意,这样你就不必记住担心稍后当您决定重用相同的定义时,但这次传递一个指针。 (2认同)
  • @CodyGray:SetWindowLongPtr是一个32位平台上的宏,所以你不会试图P/Invoke它. (2认同)
  • @CodyGray:您引用了“要编写与 32 位和 64 位版本的 Windows 兼容的代码,请使用 SetWindowLongPtr 函数”。我认为,想象有人在 C#/pinvoke 线程中阅读这句话并认为您打算将其作为 C#/pinvoke 的好建议并不夸张。尽管你没有这样做,但它很容易被误解(很明显是 ChrisV 所为)。 (2认同)