4

我像这样使用GetWindowLong:

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

但根据 MSDN 文档,我应该使用 GetWindowLongPtr 来兼容 64 位。 http://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx

GetWindowLongPtr 的 MSDN 文档说我应该这样定义它(在 C++ 中):

LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex);

我曾经使用 IntPtr 作为返回类型,但是对于 LONG_PTR 的等价物,我到底要使用什么?我还看到在 C# 中这样定义 GetWindowLong:

[DllImport("user32.dll")]
private static extern long GetWindowLong(IntPtr hWnd, int nIndex);

什么是正确的,如何确保正确的 64 位兼容性?

4

3 回答 3

7

您应该使用 IntPtr 定义 GetWindowLongPtr。在 C/C++ 中,LONG_PTR 在 32 位系统上是 32 位,在 64 位系统上是 64 位(参见此处)。C# 中的 IntPtr 旨在以相同的方式工作(请参阅此处)。

所以你想要的是:

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);
于 2008-11-26T03:43:03.550 回答
7

不幸的是,这并不容易,因为 GetWindowLongPtr 在 32 位 Windows 中不存在。在 32 位系统上,GetWindowLongPtr 只是一个指向 GetWindowLong 的 C 宏。如果您确实需要在 32 位和 64 位系统上使用 GetWindowLongPtr,则必须确定在运行时调用的正确的。请参阅pinvoke.net上的说明

于 2008-11-26T08:22:02.677 回答
3

肥皂盒是正确的。

此外,如果您需要查看 Win32 中的类型或函数应如何编组,请尝试使用PInvoke Interop Assistant。它将为大多数 Win32 API 内置生成,并且可以根据代码片段进行自定义生成。

于 2008-11-26T04:19:07.190 回答