C# 获取ChildWindowFromPointEx函数的意外CA1901警告
当我在我的VisualStudio项目中使用代码分析功能时,我在其类型参数处得到了一个意外的警告 我刚刚定义了一个名为NativePoint的结构,其中X和Y字段为Int32类型,我将其用作那些点参数的等价物 我理解在x86或x64下运行时,可移植性在值大小方面意味着什么,但是,在这种情况下,我不确定如何解决此警告,因为我使用相同的NativePoint结构来表示其他函数的POINT参数,例如:,以及许多其他函数,代码分析并没有对它们发出警告,它们在x86和x64进程上运行时可以工作 事实上,ChildWindowFromPoint和ChildWindowFromPointEx似乎只有一个额外的参数不同,两者都将相同的点结构作为参数,因此我不明白为什么ChildWindowFromPointEx会警告可移植性问题,而ChildWindowFromPoint则可以 我的问题是:在C#或VB.NET中,如何正确修复(而不是抑制)针对ChildWindowFromPointEx和RealChildWindowFromPoint函数的此警告?。也许我需要用不同的字段类型定义另一个不同的NativePoint结构,仅用于这两个函数?。但是,如果这两个函数都采用相同的点(myNativePoint)结构,为什么这两个函数在为ChildWindowFromPoint发出警告时不会发出警告呢 请注意,如果我使用structure,我会对这两个函数得到相同的警告,但仅对这两个函数C# 获取ChildWindowFromPointEx函数的意外CA1901警告,c#,.net,vb.net,winapi,pinvoke,C#,.net,Vb.net,Winapi,Pinvoke,当我在我的VisualStudio项目中使用代码分析功能时,我在其类型参数处得到了一个意外的警告 我刚刚定义了一个名为NativePoint的结构,其中X和Y字段为Int32类型,我将其用作那些点参数的等价物 我理解在x86或x64下运行时,可移植性在值大小方面意味着什么,但是,在这种情况下,我不确定如何解决此警告,因为我使用相同的NativePoint结构来表示其他函数的POINT参数,例如:,以及许多其他函数,代码分析并没有对它们发出警告,它们在x86和x64进程上运行时可以工作 事实上,C
在仔细检查负责的分析程序集后,Windows API文档与分析插件使用的数据集之间存在不匹配 规则认为在x86上,
RealChildWindowFromPoint
每4个字节应该有3个参数,而ChildWindowFromPointEx
每4个字节应该有4个参数<另一方面,code>ChildWindowFromPoint则按预期列出一个4字节参数和一个8字节参数
事实上,以这种方式声明RealChildWindowFromPoint
似乎满足了代码分析的要求,但我对Windows API调用约定了解不够,无法确定这是否是调用该方法的有效方式:
[DllImport("user32.dll", EntryPoint = "RealChildWindowFromPoint", SetLastError = false)]
public static extern IntPtr RealChildWindowFromPoint(IntPtr hwndParent, int x, int y);
考虑到
RealChildWindowFromPoint
和ChildWindowFromPointEx
的规则缺少返回值大小和x64声明的数据,而ChildWindowFromPoint
的数据已完成,我认为这只是数据中的一个错误,而不是有意推荐。似乎是一个非常虚假的警告(您是否尝试过HandleRef而不是IntPtr?)。正如您在这里所看到的,Microsoft本身禁止了许多论题:您应该使用而不是定义自己的结构。@Remy Lebeau但在评论的末尾,我指定使用System.Drawing.Point会产生相同的警告。@Simon Mourier您是指HWND类型的hwndParent参数,是的,它会产生相同的警告。可能在声明中使用internal
而不是public
(或者private
,如果您不打算直接在其他地方使用这些函数)。在任何情况下都不应使用public
。如果导出某些内容,请导出函数的包装。谢谢您的回答。也许有人应该向微软团队报告这一切。
[DllImport("user32.dll", EntryPoint = "RealChildWindowFromPoint", SetLastError = false)]
public static extern IntPtr RealChildWindowFromPoint(IntPtr hwndParent, int x, int y);