SetupDiGetDeviceInterfaceDetail необъяснимая ошибка - PullRequest
2 голосов
/ 28 июня 2009

На этот раз у меня есть ошибка, которую я снова пытаюсь выяснить, почему она существует. Хотя эту ошибку можно игнорировать, но я хотел бы знать, почему она существует на первом месте.

result = SetupDiGetDeviceInterfaceDetail(deviceInfoSet, ref anInterface, IntPtr.Zero, 0, ref buffersize, IntPtr.Zero);
            if (!result)
            {
                int errCode = Marshal.GetLastWin32Error();
                errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
                statusLabel.Text += "\n(1)SetupDiGetDeviceInterfaceDetail Error: " + errCode + " => " + errorMessage + ".";
                //break;
            }

Это первый вызов этой функции, который предназначен только для установки переменной buffersize для второго вызова функции. Я получаю распечатанное сообщение об ошибке: 122 => Область данных, переданная системному вызову, слишком мала . Судя по сообщению об ошибке, я решил, что это как-то связано со вторым параметром (ref anInterface) и что я могу игнорировать это для второго прохода, который оказался истинным; но ошибка все еще существует, и я хотел бы знать, почему, прежде чем она вернется, чтобы укусить меня в «за» месте. Рассматриваемый параметр объявляется и определяется следующим образом:

[StructLayout(LayoutKind.Sequential)] // defined here
    public struct SP_DEVICE_INTERFACE_DATA
    {
        public uint cbSize;
        public Guid InterfaceClassGuid;
        public uint Flags;
        public IntPtr Reserved;
    }

anInterface = new SP_DEVICE_INTERFACE_DATA(); // declared here
        anInterface.cbSize = (uint)Marshal.SizeOf(anInterface);
        anInterface.InterfaceClassGuid = Guid.Empty;
        anInterface.Reserved = IntPtr.Zero;
        anInterface.Flags = 0;

Я выбрал статьи MSDN, и, насколько я могу судить, здесь нет ничего плохого в коде.

1 Ответ

3 голосов
/ 29 июня 2009

Это должно произойти по замыслу. Если вы посмотрите здесь в разделе комментариев:

Использование этой функции для получения подробных сведений об интерфейсе обычно выполняется в два этапа:

1) Получить необходимый размер буфера. Вызовите SetupDiGetDeviceInterfaceDetail с указателем NULL DeviceInterfaceDetailData, нулем DeviceInterfaceDetailDataSize и допустимой переменной RequiredSize. В ответ на такой вызов эта функция возвращает требуемый размер буфера в RequiredSize и завершается с ошибкой, когда GetLastError возвращает ERROR INSUFFICIENT BUFFER.
2) Выделите буфер соответствующего размера и снова вызовите функцию, чтобы получить сведения об интерфейсе.

Если вы посмотрите на НЕДОСТАТОЧНЫЙ БУФЕР ОШИБКИ под кодами , вы увидите, что это десятичное значение 122.

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