【问题标题】:public static extern uint SendMessage(IntPtr hWnd, int unMsg, IntPtr wParam, IntPtr lParam)公共静态外部 uint SendMessage(IntPtr hWnd,int unMsg,IntPtr wParam,IntPtr lParam)
【发布时间】:2014-06-23 10:27:14
【问题描述】:

我的代码如下所示

[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 平台 SDK 文档以帮助确定应使用哪种数据类型而不是 'uint'"

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

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

谢谢, 虚拟机

【问题讨论】:

  • 这是一个完全正确的警告。返回类型必须是IntPtr
  • SendMessage 必须是本机 API 中最频繁的 P/Invoked 方法之一。因此,pinvoke.net 上的注释似乎非常好和准确。

标签: c# winapi pinvoke


【解决方案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
);

这些信息都有记录:

然而,因为SendMessage 是一个适合所有类型的函数,所以不值得过于关注有符号和无符号类型。不同的消息使用强制转换以不同的方式处理参数。因此,请随意使用最方便的类型,以它们必须明显正确的大小为模。

【讨论】:

猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2017-05-18
  • 2013-04-05
  • 2015-01-25
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多