2009-06-28 4 views
2

Diesmal habe ich einen Fehler, den ich wieder versucht habe herauszufinden, warum es existiert. Obwohl der Fehler ignoriert werden kann, würde ich gerne wissen, warum er auf dem ersten Platz existiert.SetupDiGetDeviceInterfaceDetail unerklärlicher Fehler

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; 
      } 

Dies ist der erste Aufruf dieser Funktion, die für die Einrichtung des Puffergröße Variable für den zweiten Aufruf der Funktion nur zum Zweck ist. Ich erhalte die gedruckte Fehlermeldung: 122 => Der zu einem Systemaufruf übergebene Datenbereich ist zu klein. Nach der Fehlermeldung zu urteilen, musste dies etwas mit dem zweiten Parameter (ref anInterface) zu tun haben und ich konnte dies für den zweiten Durchlauf ignorieren, der sich als wahr herausstellte; aber der Fehler existiert immer noch und ich würde gerne wissen warum, bevor es zurückkommt, um mich in den "Hintern" zu beißen. Der betreffende Parameter deklariert und damit definiert:

[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; 

Ich habe die Msdn Artikel zerpflückt und soweit ich sagen kann, es ist nichts falsch mit dem Code hier.

Antwort

3

Dies soll durch Design geschehen. Wenn Sie here unter den Kommentaren aussehen:

Mit dieser Funktion Details erhalten über eine Schnittstelle typischerweise ein zweistufiger Prozess ist:

1) Holen Sie sich die erforderliche Puffergröße. Rufen Sie SetupDiGetDeviceInterfaceDetail mit einem NULL DeviceInterfaceDetailData-Zeiger, einem DeviceInterfaceDetailDataSize von Null und einer gültigen RequiredSize-Variable auf. Als Reaktion auf einen solchen Aufruf gibt diese Funktion die erforderliche Puffergröße bei RequiredSize zurück und schlägt fehl, wenn GetLastError den Fehler FEHLERINSAUFFIZIENTPUFFER zurückgibt.
2) Ordnen Sie einen entsprechend großen Puffer zu und rufen Sie die Funktion erneut auf, um die Details zur Schnittstelle abzurufen.

Wenn Sie den Fehler UNGENÜGENDE BUFFER unter dem error codes nachschauen, werden Sie sehen, dass es Dezimalwert ist 122.