На этот раз у меня есть ошибка, которую я пытаюсь снова выяснить, почему она существует. Хотя ошибка может быть проигнорирована, но я хотел бы знать, почему она существует на первом месте.
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) Получите требуемый размер буфера. Вызовите SetupDiGetDeviceInterfaceDetail с помощью указателя NULL DeviceInterfaceDetailData, DeviceInterfaceDetailDataSize нулевой и действительной переменной RequiredSize. В ответ на такой вызов эта функция возвращает требуемый размер буфера в RequiredSize и не работает с GetLastError, возвращающим ERROR INSUFFICIENT BUFFER.
2) Выделите буфер соответствующего размера и снова вызовите функцию, чтобы получить информацию о интерфейсе.
Если вы посмотрите на НЕОБХОДИМЫЙ БУФЕР ОШИБКИ в коды ошибок, вы увидите, что это десятичное значение 122.