2012-05-16 2 views
0

У меня есть следующий класс, который перечисляет все COM-порты на локальном ПК, находя и сохраняя только те, у которых есть дружественное имя, которое начинается с данного префикса.Перечисление узлов составных устройств

Теперь, полагая, что такие COM-порты являются составной частью составного устройства и что составное устройство также имеет сетевой адаптер, как я могу найти сетевой адаптер, связанный с данным устройством? Я уверен, что должен быть относительно простой способ сделать это (у обоих устройств будет один и тот же родительский узел, на который я думаю), но я не уверен, каким будет метод non-interop ... Может ли кто-нибудь помочь?

Вот класс:

/// <summary> 
/// A class to enumerate all COM ports through USB. 
/// </summary> 
public class SerialPortUSB 
{ 

    /// <summary> 
    /// Structure to store a port name and details. 
    /// </summary> 
    public struct PortName 
    { 
     public string Port; 
     public string Fullname; 
     public bool HadPrefix; 
    }; 

    /// <summary> 
    /// Function to return all ports with the given prefix. 
    /// </summary> 
    /// <param name="prefix"></param> 
    /// <returns></returns> 
    static public List<PortName> PortsWithPrefix(string prefix) 
    { 
     List<PortName> ports = new List<PortName>(); 

     try 
     { 
      // Select all COM ports. 

      ManagementObjectSearcher searcher = new ManagementObjectSearcher( "root\\CIMV2", 
                       "SELECT * FROM Win32_SerialPort"); 




      // Now iterate results looking for those that start with the prefix. 

      foreach (ManagementObject item in searcher.Get()) 
      { 
       string friendlyName = (string)item["Caption"]; 

       if (!friendlyName.StartsWith(prefix)) 
       { 
        continue; 
       } 




       // Construct an item for this. 

       PortName name = new PortName(); 

       int start = friendlyName.LastIndexOf('(') + 1, end = friendlyName.LastIndexOf(')'); 

       name.HadPrefix = true; 

       name.Port = friendlyName.Substring(start, end - start); 
       name.Fullname = friendlyName; 

       ports.Add(name); 
      } 
     } 
     catch (ManagementException e) 
     { 
      // Failed to find any... 
     } 




     // Return the list of ports. 

     return ports; 
    } 
} 

ответ

0

Мысль я ответить на мои собственные, а не удалять вопрос только в случае, если кто-то найдет ответ полезным.

Оказывается, PNPDeviceID, свойство, присутствующее как в Win32_SerialPorts, так и в Win32_NetworkAdapters, содержит идентификатор, уникальный для устройства, поэтому их можно идентифицировать обоим. Сначала необходимо перечислить последовательные порты, затем извлечь уникальную часть PNPDeviceID, а затем найти все сетевые адаптеры, которые LIKE '% value%', где значение является частью PNPDeviceID.

Оказывается число является одинаковым для обоих, то есть:

Последовательный порт PNPDeviceID = USB \ VID_17DC & PID_0500 & MI_02 \ 8 & 18F2972 0002"

и

Сеть Адаптер PNPDeviceID = USB \ VID_17DC & PID_0500 & MI_00 \ 8 & 18F2972 0000 "

, где общий идентификатор - 18F2972.

Смежные вопросы