Получение неожиданного предупреждения CA1901 для функции ChildWindowFromPointEx - PullRequest
0 голосов
/ 24 февраля 2019

Когда я использую функцию анализа кода в своем проекте Visual Studio, я получаю неожиданное CA1901 предупреждение для ChildWindowFromPointEx , а также для RealChildWindowFromPoint , вих параметры типа POINT .

Я только что определил структуру с именем NativePoint с полями X и Y как Int32 типа, который я использую в качестве эквивалента для этих POINT параметров.

Я понимаю, что означает переносимость с точки зрения размера значения при работе под x86 илиx64, однако, в этом случае я не уверен, как решить это предупреждение, потому что я использую такую ​​же структуру NativePoint для POINT параметров других функций, таких как, например: ChildWindowFromPoint , ClientToScreen , GetCursorPos и многие другие, и анализ кода не предупреждает о них, и они работают при запуске в процессах x86 и x64.

На самом деле ChildWindowFromPoint и ChildWindowFromPointEx , кажется, отличаются только одним дополнительным параметром, оба принимают одну и ту же структуру POINT в качестве параметра, поэтому я неНе понимаю, почему ChildWindowFromPointEx предупреждает о проблемах переносимости, в то время как для ChildWindowFromPoint все в порядке.

Мой вопрос: как в C # или VB.NET, как мне правильноисправить (не подавить) это предупреждение для ChildWindowFromPointEx и RealChildWindowFromPoint функций ?.Может быть, мне нужно определить другую другую NativePoint структуру с разными типами полей только для использования с этими двумя функциями ?.Но почему эти две функции выдают предупреждение, в то время как для ChildWindowFromPoint нет, если обе они принимают одинаковую структуру POINT (my NativePoint )?.

Обратите внимание, что я получаю одно и то же предупреждение для этих двух функций, если использую структуру System.Drawing.Point , но только для этих двух.


[DllImport("user32.dll", EntryPoint="ChildWindowFromPointEx", SetLastError=false)]
public extern static IntPtr ChildWindowFromPointEx(IntPtr hwndParent,
                                              NativePoint point, 
                                                     uint flags);

[DllImport("user32.dll", EntryPoint="RealChildWindowFromPoint", SetLastError=false)]
public extern static IntPtr RealChildWindowFromPoint(IntPtr hwndParent, 
                                                NativePoint point);

[StructLayout(LayoutKind.Sequential)]
public struct NativePoint {
    public int X;
    public int Y;
}

1 Ответ

0 голосов
/ 24 февраля 2019

После поиска в ответственной сборке анализа существует несоответствие между документацией Windows API и набором данных, используемым плагином анализа.

Правило думает, что RealChildWindowFromPoint должно иметь по 3 параметра каждого4 байта и ChildWindowFromPointEx 4 параметра на каждые 4 байта в x86.ChildWindowFromPoint с другой стороны указан как имеющий один 4-байтовый параметр и один 8-байтовый параметр, как и ожидалось.

Действительно, объявление RealChildWindowFromPoint таким образом, кажется, удовлетворяет анализу кода, но я не знаюДостаточно о соглашениях о вызовах API Windows, чтобы сказать, является ли это действительным способом вызова этого метода:

[DllImport("user32.dll", EntryPoint = "RealChildWindowFromPoint", SetLastError = false)]
public static extern IntPtr RealChildWindowFromPoint(IntPtr hwndParent, int x, int y);

Учитывая, что в правилах для RealChildWindowFromPoint и ChildWindowFromPointEx отсутствуют данные для размера возвращаемого значения, кака также объявления x64, в то время как данные для ChildWindowFromPoint полны, я бы предположил, что это просто ошибка в данных, а не преднамеренная рекомендация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...