如何声明POINT结构以避免代码分析错误
本文关键字:代码 错误 结构 何声明 声明 POINT | 更新日期: 2023-09-27 18:17:13
我有一个POINT
结构的声明问题,我与Windows函数WindowFromPoint
和GetCursorPos
结合使用。当结构具有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);
下面是我尝试做的总结:
- X和y声明为
int
(如上所述)-应用程序正常工作,代码分析显示错误。 - X和y声明为
Int16
——当函数GetCursorPos
被调用时,应用程序崩溃,代码分析没有返回错误。 - X和y声明为
Int32
——应用程序正常工作,代码分析显示错误。 - X和y声明为
Int64
——函数WindowFromPoint
返回意外结果,代码分析显示错误
有没有人知道如何让应用程序工作没有代码分析错误(目前必须抑制)?
嗯,Int16
和Int64
失败了,因为它们是错误的类型。本机声明使用32位符号的LONG
。所以int
或Int32
都是正确的。
在你的问题中,结构体的声明正是我如何声明的。但是如果你喜欢的话,你也可以使用Int32
。
然而,WindowFromPoint
是不寻常的。它接受POINT
而不是POINT*
,这有点奇怪。我怀疑微软的工程师在很久以前就弄错了,而且由于显而易见的原因,现在无法更改。
看起来WindowFromPoint
的这个不寻常的函数声明实际上是混淆代码分析工具的原因。重要的是你的代码能正常工作。因此,请使用正确的代码(就像在这个问题的代码中找到的那样),并抑制虚假的代码分析警告。