如何声明POINT结构以摆脱代码分析错误?

时间:2015-10-12 14:31:03

标签: c# .net visual-studio-2013 pinvoke code-analysis

我在声明POINT结构时遇到问题,我将其与Windows函数WindowFromPointGetCursorPos结合使用。当结构具有int字段时,代码分析报告错误:CA1901:PInvokeDeclarationsShouldBePortable(CA1901 P / Invoke声明应该是可移植的。因为它在您的代码中声明,参数'指向P / Invoke在{32}平台上,NativeMethods.WindowFromPoint(NativeMethods.POINTAPI)将是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返回意外结果,代码分析显示错误。
  5. 有没有人知道如何在没有代码分析错误(目前必须被禁止)的情况下让应用程序正常工作?

1 个答案:

答案 0 :(得分:2)

好吧,Int16Int64失败,因为它们是错误的类型。本机声明使用{32}签名的LONG。因此intInt32都是正确的。

你问题中结构的声明正是我如何声明这一点。但如果您愿意,也可以使用Int32

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

WindowFromPoint看起来这个不寻常的函数声明实际上是代码分析工具的混乱。但重要的是你的代码是有效的。因此,请使用正确的代码(在此问题的代码中找到),并禁止伪造的代码分析警告。

相关问题