2009-06-28 137 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.