Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取ChildWindowFromPointEx函数的意外CA1901警告_C#_.net_Vb.net_Winapi_Pinvoke - Fatal编程技术网

C# 获取ChildWindowFromPointEx函数的意外CA1901警告

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

当我在我的VisualStudio项目中使用代码分析功能时,我在其类型参数处得到了一个意外的警告

我刚刚定义了一个名为NativePoint的结构,其中XY字段为Int32类型,我将其用作那些参数的等价物

我理解在x86或x64下运行时,可移植性在值大小方面意味着什么,但是,在这种情况下,我不确定如何解决此警告,因为我使用相同的NativePoint结构来表示其他函数的POINT参数,例如:,以及许多其他函数,代码分析并没有对它们发出警告,它们在x86和x64进程上运行时可以工作

事实上,ChildWindowFromPointChildWindowFromPointEx似乎只有一个额外的参数不同,两者都将相同的结构作为参数,因此我不明白为什么ChildWindowFromPointEx会警告可移植性问题,而ChildWindowFromPoint则可以

我的问题是:在C#或VB.NET中,如何正确修复(而不是抑制)针对ChildWindowFromPointExRealChildWindowFromPoint函数的此警告?。也许我需要用不同的字段类型定义另一个不同的NativePoint结构,仅用于这两个函数?。但是,如果这两个函数都采用相同的(myNativePoint)结构,为什么这两个函数在为ChildWindowFromPoint发出警告时不会发出警告呢

请注意,如果我使用structure,我会对这两个函数得到相同的警告,但仅对这两个函数



在仔细检查负责的分析程序集后,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);