【问题标题】:SetupDiGetDeviceInterfaceDetail unexplainable errorSetupDiGetDeviceInterfaceDetail 无法解释的错误
【发布时间】:2009-06-28 11:29:08
【问题描述】:

这次我遇到了一个错误,我一直在尝试找出它存在的原因。虽然错误可以忽略,但我想知道它为什么会出现在第一位。

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 文章拆开,据我所知,这里的代码没有任何问题。

【问题讨论】:

    标签: c# .net usb


    【解决方案1】:

    这应该是设计使然。如果您在 cmets 部分下查看 here

    使用此函数获取有关接口的详细信息通常分为两步:

    1) 获取所需的缓冲区大小。使用 NULL DeviceInterfaceDetailData 指针、零的 DeviceInterfaceDetailDataSize 和有效的 RequiredSize 变量调用 SetupDiGetDeviceInterfaceDetail。作为对此类调用的响应,此函数在RequiredSize 处返回所需的缓冲区大小,并因GetLastError 返回错误缓冲区而失败。
    2) 分配适当大小的缓冲区并再次调用该函数以获取接口详细信息。

    如果你查看error codes下的ERROR INSUFFICIENT BUFFER,你会看到它是十进制值122。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2015-11-18
      • 2011-12-11
      相关资源
      最近更新 更多