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

问题描述 投票:-4回答:1

我有下面的代码

[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

c# winapi pinvoke
1个回答
1
投票

消息正确。该函数返回LRESULT,它是有符号的指针大小的类型。因此,在C#中,您应该使用IntPtr

严格来说,message参数是无符号的,WPARAM是无符号的,LPARAM是有符号的,因此,如果您希望效仿,那么您将拥有:

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

此信息全部记录在案:

但是,由于Windows Data Types是一个大小适合所有类型的函数,因此不值得过于迷恋有符号和无符号类型。不同的消息使用强制转换以不同的方式对待参数。因此,请随意使用最方便的类型,以免它们必须明显地是正确的大小。

© www.soinside.com 2019 - 2024. All rights reserved.