我有下面的代码
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern uint SendMessage(IntPtr hWnd, int unMsg, IntPtr wParam,
IntPtr lParam);
Fxcop错误:“正如在代码中声明的那样,P / Invoke'SendMessage(IntPtr,int,IntPtr,IntPtr)'的返回类型在64位平台上将为4字节宽。这是不正确的,因为该API的实际本机声明表明它在64位平台上应为8字节宽。请查阅MSDN Platform SDK文档,以帮助确定应使用哪种数据类型而不是'uint'“”
因此,要解决上述错误,我需要更改返回类型UIntPtr吗?
[请帮助我解决此问题,并提供合理的理由。
谢谢,VMG
消息正确。该函数返回LRESULT
,它是有符号的指针大小的类型。因此,在C#中,您应该使用IntPtr
。
严格来说,message参数是无符号的,WPARAM
是无符号的,LPARAM
是有符号的,因此,如果您希望效仿,那么您将拥有:
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SendMessage(
IntPtr hWnd,
uint Msg,
UIntPtr wParam,
IntPtr lParam
);
此信息全部记录在案:
SendMessage
SendMessage
但是,由于Windows Data Types是一个大小适合所有类型的函数,因此不值得过于迷恋有符号和无符号类型。不同的消息使用强制转换以不同的方式对待参数。因此,请随意使用最方便的类型,以免它们必须明显地是正确的大小。