SetupDiGetDeviceInterfaceDetail无法解释的错误

时间:2009-06-28 11:29:08

标签: c# .net usb

这次我有一个错误,我一直在尝试弄清楚它为什么存在。虽然错误可以忽略,但我想知道为什么它存在于第一位。

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 个答案:

答案 0 :(得分:3)

这应该是设计发生的。如果你在评论部分看here

使用此函数获取有关接口的详细信息通常需要两个步骤:

1)获取所需的缓冲区大小。使用NULL DeviceInterfaceDetailData指针,一个零的DeviceInterfaceDetailDataSize和一个有效的RequiredSize变量调用SetupDiGetDeviceInterfaceDetail。响应此类调用,此函数在RequiredSize返回所需的缓冲区大小,并在GetLastError返回ERROR INSUFFICIENT BUFFER时失败。
2)分配适当大小的缓冲区并再次调用该函数以获取接口详细信息。

如果您在error codes下查找ERROR INSUFFICIENT BUFFER,您会看到它是十进制值122.