如何声明 POINT 结构以消除代码分析错误?
How to declare POINT structure to get rid of Code Analysis error?
我在声明 POINT
结构时遇到问题,我将其与 Windows 函数 WindowFromPoint
和 GetCursorPos
结合使用。当结构具有 int
字段时,代码分析报告错误:CA1901:PInvokeDeclarationsShouldBePortable(CA1901 P/Invoke 声明应该是可移植的。正如在您的代码中声明的那样,[= 的参数 'point' 43=] NativeMethods.WindowFromPoint(NativeMethods.POINTAPI)
在 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
被调用时应用程序崩溃,代码分析 returns 没有错误。
- X 和 y 声明为
Int32
--- 应用程序运行正常,代码分析显示错误。
- X 和 y 声明为
Int64
--- 函数 WindowFromPoint
returns 意外结果,代码分析显示错误。
有人知道如何在没有代码分析错误(目前必须抑制)的情况下让应用程序运行吗?
嗯,Int16
和 Int64
失败了,因为它们是错误的类型。本机声明使用 LONG
,它是有符号的 32 位。所以 int
或 Int32
都是正确的。
你问题中的结构声明正是我要声明的方式。但如果您愿意,也可以使用 Int32
。
然而,WindowFromPoint
是不寻常的。它接受 POINT
而不是 POINT*
这有点奇怪。我怀疑微软工程师很久以前就弄错了,现在由于明显的原因无法更改。
看起来 WindowFromPoint
的这种不寻常的函数声明实际上是代码分析工具混淆的原因。重要的是您的代码有效。因此,请使用正确的代码(如您在此问题中的代码中所找到的那样),并抑制虚假代码分析警告。
我在声明 POINT
结构时遇到问题,我将其与 Windows 函数 WindowFromPoint
和 GetCursorPos
结合使用。当结构具有 int
字段时,代码分析报告错误:CA1901:PInvokeDeclarationsShouldBePortable(CA1901 P/Invoke 声明应该是可移植的。正如在您的代码中声明的那样,[= 的参数 'point' 43=] NativeMethods.WindowFromPoint(NativeMethods.POINTAPI)
在 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
被调用时应用程序崩溃,代码分析 returns 没有错误。 - X 和 y 声明为
Int32
--- 应用程序运行正常,代码分析显示错误。 - X 和 y 声明为
Int64
--- 函数WindowFromPoint
returns 意外结果,代码分析显示错误。
有人知道如何在没有代码分析错误(目前必须抑制)的情况下让应用程序运行吗?
嗯,Int16
和 Int64
失败了,因为它们是错误的类型。本机声明使用 LONG
,它是有符号的 32 位。所以 int
或 Int32
都是正确的。
你问题中的结构声明正是我要声明的方式。但如果您愿意,也可以使用 Int32
。
然而,WindowFromPoint
是不寻常的。它接受 POINT
而不是 POINT*
这有点奇怪。我怀疑微软工程师很久以前就弄错了,现在由于明显的原因无法更改。
看起来 WindowFromPoint
的这种不寻常的函数声明实际上是代码分析工具混淆的原因。重要的是您的代码有效。因此,请使用正确的代码(如您在此问题中的代码中所找到的那样),并抑制虚假代码分析警告。