如何声明POINT结构以避免代码分析错误

本文关键字:代码 错误 结构 何声明 声明 POINT | 更新日期: 2023-09-27 18:17:13

我有一个POINT结构的声明问题,我与Windows函数WindowFromPointGetCursorPos结合使用。当结构具有int字段时,代码分析报告错误:CA1901:PInvokeDeclarationsShouldBePortable (CA1901 P/Invoke声明应该是可移植的)。正如在代码中声明的那样,P/Invoke NativeMethods.WindowFromPoint(NativeMethods.POINTAPI)的参数'point'在32位平台上将是8字节宽。)当我将字段类型更改为Int16时,不会返回错误,但函数GetCursorPos停止工作。

我在Windows 8.1 x64上运行这个应用程序。函数和结构的签名如下:

[DllImport("user32.dll")]
internal static extern IntPtr WindowFromPoint(POINTAPI point);
[StructLayout(LayoutKind.Sequential)]
public struct POINTAPI
{
    internal int x;
    internal int y;
}
[DllImport("user32.dll")]
internal static extern int GetCursorPos(out POINTAPI lpPoint);

下面是我尝试做的总结:

  1. X和y声明为int(如上所述)-应用程序正常工作,代码分析显示错误。
  2. X和y声明为Int16——当函数GetCursorPos被调用时,应用程序崩溃,代码分析没有返回错误。
  3. X和y声明为Int32——应用程序正常工作,代码分析显示错误。
  4. X和y声明为Int64——函数WindowFromPoint返回意外结果,代码分析显示错误

有没有人知道如何让应用程序工作没有代码分析错误(目前必须抑制)?

如何声明POINT结构以避免代码分析错误

嗯,Int16Int64失败了,因为它们是错误的类型。本机声明使用32位符号的LONG。所以intInt32都是正确的。

在你的问题中,结构体的声明正是我如何声明的。但是如果你喜欢的话,你也可以使用Int32

然而,WindowFromPoint是不寻常的。它接受POINT而不是POINT*,这有点奇怪。我怀疑微软的工程师在很久以前就弄错了,而且由于显而易见的原因,现在无法更改。

看起来WindowFromPoint的这个不寻常的函数声明实际上是混淆代码分析工具的原因。重要的是你的代码能正常工作。因此,请使用正确的代码(就像在这个问题的代码中找到的那样),并抑制虚假的代码分析警告。