首先是一个背景问题:
一般来说,int
和IntPtr
之间有什么区别?我的猜测是它是一个实际的对象而不是int
或byte
之类的值。假设是真的:
所以他们不一样。然而,我看到手柄代表两者。
Control.Handle
int(或uint):可以设置PInvoke返回int
并且它可以正常工作:
[DllImport("coredll.dll", SetLastError = true)]
public static extern int GetForegroundWindow();
private string GetActiveWindow()
{
const int nChars = 256;
int handle = 0;
StringBuilder Buff = new StringBuilder(nChars);
handle = CoreDLL.GetForegroundWindow();
if (CoreDLL.GetWindowText(handle, Buff, nChars) > 0)
{
return Buff.ToString();
}
return "";
}
那么,int
vs IntPtr
?手柄有问题吗?你能用吗?
答案 0 :(得分:29)
int
长度为32位。 IntPtr
与您的架构的指针一样长。因此,指针只能存储在32位系统的int
中,而 总是存储在IntPtr
中。
请注意,“int as a return value”示例 not 使用int
来保存指针,但只是为了保存数值。这并不意味着int
自动具有正确的大小:该P / Invoke签名的作者应该转到GetForegroundWindow
的文档并看到它返回HWND
。
然后,从平台SDK中的windef.h
(或this MSDN page),我们可以看到HWND
是HANDLE
,PVOID
是GetForegroundWindow
......一个指针!
因此,据我所知,该签名是错误的,因为IntPtr
的返回值的大小取决于架构。因此,它也应该是int
。
<强>更新强>
虽然可以从上面推断,但我认为值得明确指出:
IntPtr
而不是int
将永远不会导致问题,即使它们在64位Windows上运行;由于此时大多数应用程序都是32位,因此可以让您经常摆脱这些错误。IntPtr
代替int
无法保证会导致问题,因为实际上很可能会遇到遇到的值在int
的32位中。这进一步降低了错误将表现为应用程序错误的可能性。因此,对于实际显示的错误,必须同时满足三个条件:
IntPtr
应该使用int
。