Как я могу узнать, что не так с интерфейсом SetupDiGetClassDev в C #? - PullRequest
1 голос
/ 26 июня 2009

Как узнать, что не так с возвращенным набором информации об устройстве? Я снова переписываю свой код и все еще сталкиваюсь с тем же камнем преткновения.

deviceInfoSet = SetupDiGetClassDevs(ref tGuid, 0, IntPtr.Zero, (uint)SetupDiFlags.DIGCF_PRESENT );
if (deviceInfoSet.ToInt32() == INVALID_DEVICE_HANDLE)
{
   int errCode = Marshal.GetLastWin32Error();
   errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
   statusLabel.Text += "Invalid deviceinfoset returned: " + errCode + " => " + errorMessage + ".";
}

Приведенный выше код не вызывает никаких ошибок, но когда я использую приведенный ниже код:

result = true;
while (result)
{
    result = SetupDiEnumDeviceInterfaces(deviceInfoSet, IntPtr.Zero, ref tGuid, Index, ref anInterface);
    if (!result)
    {
        int errCode = Marshal.GetLastWin32Error();
        errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
        statusLabel.Text += "\nSetDiEnumDeviceInterface Error: " + errCode + " => " + errorMessage + ".";
        break;
    }
    Index++;
}

, чтобы попытаться получить доступ к списку установок информации об устройстве, возвращается код ошибки 259 ( Больше нет данных ). Я в растерянности относительно того, что я делаю неправильно.

Ответы [ 4 ]

1 голос
/ 26 июня 2009

Вы уверены, что используете правильный GUID?

Выезд http://blogs.msdn.com/doronh/archive/2006/02/15/532679.aspx

Редактировать: все остальное выглядит по-книжному и правильно.

Edit2: Попытка включить DIGCF_DEVICEINTERFACE в вызов SetupDiGetClassDevs и посмотреть, работает ли это для вас. То есть DIGCF_PRESENT и DIGCF_DEVICEINTERFACE.

Edit3: для 64-битной проблемы (@Thies), проверьте http://social.msdn.microsoft.com/Forums/en-US/windowssdk/thread/ea816aea-f718-4a0e-b013-0aa273de037f

0 голосов
/ 30 ноября 2012

Проблема начинается с того, как вызывается SetupDiGetClassDevs.

Если вы хотите получить путь к устройству, используйте SetupDiGetClassDevs (& GUID_DEVINTERFACE_USB_DEVICE ,,,)

SetupDiEnumDeviceInterfaces завершается с ошибкой 259, если SetupDiGetClassDevs задан неправильный GUID в ClassGuid, который, как говорит справка MS, является указателем на GUID для класса настройки устройства или класса интерфейса устройства.

Включаемый файл devguid.h содержит набор значений GUID_DEVCLASS. Они НЕ совпадают со значениями GUID_DEVINTERFACE_ *, которые вам нужны.

Используйте #include, включающее ksuuids.h, где вы найдете значения GUID_DEVINTERFACE_ *.

На моем веб-сайте есть более подробное объяснение с некоторым исходным кодом, который должен помочь в правильном перечислении USB-устройств.

См. http://pixcl.com/SetupDiEnumInterfaces_Fail.htm

0 голосов
/ 26 июня 2009

У меня были проблемы с симуляцией, связанные с работой в 64-битной Windows. Я так и не понял, и закончил жестким заданием пути устройства в моем коде - что не рекомендуется.

Я думаю, что это связано с неправильной настройкой структур API для 64-разрядных систем.

Надеюсь, что это может помочь привести кого-то еще к ответу (и, возможно, помочь с моей проблемой)

Пожалуйста, укажите, используете ли вы 64-битную версию и пытались ли вы использовать тот же код в 32-битной ОС?

0 голосов
/ 26 июня 2009

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

Так ли это? Вы точно знаете, что устройство в настоящее время пытается вернуть вам данные?

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