2009-06-28 4 views
2

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

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, насколько я могу сказать, что нет ничего плохого с кодом здесь.

ответ

3

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

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

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

Если вы заметили ошибку НЕОБХОДИМОГО BUFFER под error codes, вы увидите, что это десятичное значение 122.

Смежные вопросы