public static extern uint SendMessage(IntPtr hWnd,int unMsg,IntPtr wParam,IntPtr lParam)

时间:2014-06-23 10:27:15

标签: c# winapi pinvoke

我的代码如下

[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern uint SendMessage(IntPtr hWnd, int unMsg, IntPtr wParam, 
    IntPtr lParam);

Fxcop错误:“正如在代码中声明的那样,在64位平台上,P / Invoke'SendMessage(IntPtr,int,IntPtr,IntPtr)的返回类型将是4字节宽。这是不正确的,因为此API的实际本机声明表明它在64位平台上应该是8字节宽。请参阅MSDN Platform SDK文档以获取帮助确定应使用哪种数据类型而不是'uint'“

所以要修复上面的错误,我需要更改返回类型UIntPtr吗?

请帮我解决这个问题,并给我正当理由。

谢谢, VMG

1 个答案:

答案 0 :(得分:1)

消息是正确的。该函数返回LRESULT,它是一个带符号的指针大小类型。所以在C#中你应该使用IntPtr

严格来说,邮件参数是未签名的,WPARAM是未签名的,LPARAM已签名,因此如果您希望效仿,那么您将拥有:

[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr SendMessage(
    IntPtr hWnd, 
    uint Msg, 
    UIntPtr wParam, 
    IntPtr lParam
);

此信息全部记录在案:

但是,因为SendMessage是一种适合所有类型的函数,所以不值得在签名和无符号类型上挂起。不同的消息使用强制转换以不同方式处理参数。因此,请随意使用最方便的类型,模块化它们必须明确的尺寸。