C # Запрошенный HardwareID не совпадает с идентификатором экземпляра через SetupApi - PullRequest
0 голосов
/ 17 января 2019

Моя основная цель - включить / отключить USB-устройство, подключенное через Bluetooth, в коде.

Сейчас я запрашиваю устройства следующим образом:

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

        foreach (ManagementObject queryObj in searcher.Get())
        {
            if (queryObj["Caption"] != null && queryObj["Caption"].ToString().Contains("(COM"))
            {
                if(queryObj["Caption"] != null)
                {
                    string caption = queryObj["Caption"].ToString();

                    string[] portNames = SerialPort.GetPortNames();

                    foreach (var port in portNames)
                    {
                        if(caption.Contains(port))
                        {
                            settings.PortName = port;
                            break;
                        }
                    }
                }

                if (queryObj["HardwareID"] != null) 
                {
                    string[] hardwareID = queryObj["HardwareID"] as string[];
                    // set our hardwareID
                    settings.HardwareID = hardwareID.FirstOrDefault();
                }

                if (queryObj["ClassGuid"] != null) 
                {
                    Guid classGuid = Guid.Parse(queryObj["ClassGuid"].ToString());
                    // set our guid
                    settings.Guid = classGuid;
                }
            }
        }

Который я храню в локальной базе данных для использования, когда я хочу включить / отключить мое устройство. Я следую принятому ответу на этот пост для обработки функции включения / выключения. Однако при пошаговом выполнении этого кода он не совпадает с идентификатором оборудования, который я извлек при первоначальном запросе устройств.

Вот код, который обрабатывает сравнение:

// Find the index of the particular DeviceInfoData for the instanceId.
        private static int GetIndexOfInstance(SafeDeviceInfoSetHandle handle, DeviceInfoData[] diData, string instanceId)
        {
            const int ERROR_INSUFFICIENT_BUFFER = 122;
            for (int index = 0; index <= diData.Length - 1; index++)
            {
                StringBuilder sb = new StringBuilder(1);
                int requiredSize = 0;
                bool result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                if (result == false && Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
                {
                    sb.Capacity = requiredSize;
                    result = NativeMethods.SetupDiGetDeviceInstanceId(handle.DangerousGetHandle(), ref diData[index], sb, sb.Capacity, out requiredSize);
                }
                if (result == false)
                    throw new Win32Exception();
                if (instanceId.Equals(sb.ToString()))
                {
                    return index;
                }
            }
            // not found
            return -1;
        }

SetupDiGetDeviceInstanceId возвращает только 1 результат на основе classGuid, возвращенного из исходного запроса, поэтому я предполагаю, что это правильное устройство, просто неправильный идентификатор для сравнения.

Я читал, что идентификатор экземпляра устройства может отличаться в зависимости от ОС, однако, если я запрашиваю устройства на одном и том же компьютере, то не должен ли аппаратный идентификатор быть согласованным?

Первоначальный запрашиваемый HardwareID : "FTDIBUS \ COMPORT & VID_0403 & PID_6001"

Идентификатор экземпляра : "FTDIBUS \ VID_0403 + PID_6001 + A506WQGGA \ 0000"

ОС : Windows 10

Есть четкое сходство между этими двумя значениями, но оно продолжает терпеть неудачу из-за того, что они не совпадают. Я совсем не знаком с этой областью, поэтому любая помощь будет отличной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...