我正在使用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?我也看到GetWindowLong在C#中定义为:
[DllImport("user32.dll")]
private static extern long GetWindowLong(IntPtr hWnd, int nIndex);
什么是正确的,我如何确保正确的64位兼容性?
答案 0 :(得分:7)
您应该使用IntPtr定义GetWindowLongPtr。在C / C ++中,LONG_PTR在32位系统上是32位,在64位系统上是64位(参见here)。 C#中的IntPtr旨在以相同的方式工作(请参阅here)。
所以你想要的是:
[DllImport("user32.dll")]
private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);
答案 1 :(得分:6)
不幸的是,这并不容易,因为在32位Windows中不存在GetWindowLongPtr。在32位系统上,GetWindowLongPtr只是一个指向GetWindowLong的C宏。如果你真的需要在32位和64位系统上使用GetWindowLongPtr,你必须确定在运行时调用正确的一个。请参阅pinvoke.net
上的说明答案 2 :(得分:3)
SoapBox是正确的。
此外,如果您需要查看Win32中的类型或函数应该如何编组,请尝试使用PInvoke Interop Assistant。它将内置大多数Win32 API的代,并可以基于代码片段进行自定义生成。