我在声明POINT
结构时遇到问题,我将其与Windows函数WindowFromPoint
和GetCursorPos
结合使用。当结构具有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);
以下是我尝试过的内容摘要:
int
(如上所述)---应用程序正常运行,代码分析显示错误。Int16
---当调用函数GetCursorPos
时,应用程序崩溃,代码分析不会返回错误。Int32
---应用程序正常运行,代码分析显示错误。Int64
---函数WindowFromPoint
返回意外结果,代码分析显示错误。有没有人知道如何在没有代码分析错误(目前必须被禁止)的情况下让应用程序正常工作?
答案 0 :(得分:2)
好吧,Int16
和Int64
失败,因为它们是错误的类型。本机声明使用{32}签名的LONG
。因此int
或Int32
都是正确的。
你问题中结构的声明正是我如何声明这一点。但如果您愿意,也可以使用Int32
。
然而,WindowFromPoint
并不常见。它接受POINT
而不是POINT*
这有点奇怪。我怀疑微软工程师很久以前就犯了这个错误,并且由于显而易见的原因现在无法改变它。
WindowFromPoint
看起来这个不寻常的函数声明实际上是代码分析工具的混乱。但重要的是你的代码是有效的。因此,请使用正确的代码(在此问题的代码中找到),并禁止伪造的代码分析警告。