2009-06-28 136 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; 
      } 

这是此功能这仅仅是用于设置缓冲区大小可变用于第二呼叫的功能的目的的第一呼叫。我收到打印的错误消息: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)获取所需的缓冲区大小。用一个NULL DeviceInterfaceDetailData指针,一个DeviceInterfaceDetailDataSize为零和一个有效的RequiredSize变量来调用SetupDiGetDeviceInterfaceDetail。为了响应这样的调用,该函数返回RequiredSize所需的缓冲区大小,并且GetLastError返回错误不足缓冲区时失败。
2)分配适当大小的缓冲区并再次调用函数以获取接口详细信息。

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