2009-06-28 7 views
2

Cette fois j'ai une erreur que j'ai essayé à nouveau de comprendre pourquoi il existe. Bien que l'erreur puisse être ignorée mais j'aimerais savoir pourquoi elle existe en 1ère place.SetupDiGetDeviceInterfaceDetail d'erreur inexplicables

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

C'est le 1er appel à cette fonction qui est juste dans le but de régler la buffersize variable pour le deuxième appel à la fonction. Je reçois le message d'erreur affiché: 122 => La zone de données passée à un appel système est trop petite. A en juger par le message d'erreur, je me suis dit que cela devait avoir quelque chose à voir avec le second paramètre (ref anInterface) et que je pouvais l'ignorer pour le second passage qui s'est avéré être vrai; mais l'erreur existe toujours et j'aimerais savoir pourquoi avant de revenir me mordre à l'arrière. Le paramètre en question est déclarée et définie ainsi:

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

J'ai pris à part les articles et msdn pour autant que je peux dire qu'il n'y a rien de mal avec le code ici.

Répondre

3

Ceci est censé se passer par la conception. Si vous regardez here dans la section commentaires:

En utilisant cette fonction pour obtenir des détails sur une interface est généralement un processus en deux étapes:

1) Obtenez la taille du tampon nécessaire. Appelez SetupDiGetDeviceInterfaceDetail avec un pointeur NIND DeviceInterfaceDetailData, un DeviceInterfaceDetailDataSize de zéro et une variable RequiredSize valide. En réponse à un tel appel, cette fonction renvoie la taille de tampon requise à RequiredSize et échoue avec GetLastError retournant ERROR INSUFFICIENT BUFFER.
2) Allouer un tampon de taille appropriée et appeler à nouveau la fonction pour obtenir les détails de l'interface.

Si vous regardez l'erreur TAMPON INSUFFISANTE sous le error codes, vous verrez qu'il est valeur décimale 122.