Название: USB устройства
Отправлено: Vera от Октября 23, 2009, 14:50
Всем здравствуйте! Столкнулась с проблемой построения списка USB-устройств и открытия какого-либо из них... Пыталась сделать это через Winapi-функции, но почему-то прога в время обращения к этим функциям виснет. Можно ли сделать это только лишь средствами Qt? PS пишите плз для дураков.. я начинающий программист в этой сфере ::)
Название: Re: USB устройства
Отправлено: Пантер от Октября 23, 2009, 16:04
В Qt для этого нет средств, так что только WinApi. Запости сюда свой код, может кто и поможет.
Название: Re: USB устройства
Отправлено: Vera от Октября 26, 2009, 17:07
Есть вот такой класс для работы с USB-устройством: #ifndef USBInterfH #define USBInterfH //--------------------------------------------------------------------------- #include <setupapi.h> #include <QString>
class TUSBio { public: QString *DevicePathList; HANDLE NewHandle; private:
HDEVINFO DeviceList;
DWORD NextDeviceID;
int __fastcall GetDevicePath(const GUID &DeviceGuid, int DeviceIndex, QString &Path);
GUID DeviceGuid;
public: __fastcall TUSBio(); virtual __fastcall ~TUSBio(); //===================== Поиск устройств =====================================//
bool __fastcall Scan(const GUID &ADeviceGuid);
//===========================================================================//
//============= Открытие выбранного устройства из списка ====================//
bool _fastcall Open(int index);
//===========================================================================//
//======================== Закрытие устройства ==============================//
void _fastcall Close();
//===========================================================================//
/*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/
//===========================================================================// }; //--------------------------------------------------------------------------- #endif
Вот реализация его функций: //--------------------------------------------------------------------------- #include "USBInterf.h" #include <setupapi.h> #include <qt_windows.h> #include <windows.h> #include "ECE02061_XPioctl.h" #include <string> //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- TUSBio::TUSBio() { DevicePathList = new QString(); NewHandle = INVALID_HANDLE_VALUE; } //---------------------------------------------------------------------------
TUSBio::~TUSBio() { delete (DevicePathList); } //---------------------------------------------------------------------------
int TUSBio::GetDevicePath(const GUID &DeviceGuid, int DeviceIndex, QString &Path)
{ bool BOOLRes; DWORD DWORDRes;
SP_DEVICE_INTERFACE_DATA DeviceData;
DeviceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); BOOLRes = SetupDiEnumDeviceInterfaces(DeviceList, NULL, &DeviceGuid, DeviceIndex, &DeviceData);
if (!BOOLRes) { return GetLastError(); }
DWORD RequiredSize = 0; SetupDiGetDeviceInterfaceDetail(DeviceList, &DeviceData, NULL, 0, &RequiredSize, NULL);
if ( RequiredSize==0) return GetLastError();
SP_DEVICE_INTERFACE_DETAIL_DATA *DeviceInterfaceDetail; DeviceInterfaceDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA*) new char[RequiredSize]; DeviceInterfaceDetail->cbSize = 5; BOOLRes = SetupDiGetDeviceInterfaceDetail(DeviceList, &DeviceData, DeviceInterfaceDetail, RequiredSize, &RequiredSize, NULL);
if (BOOLRes) Path = DeviceInterfaceDetail->DevicePath[0];
delete ((char*)DeviceInterfaceDetail);
if (!BOOLRes) GetLastError();
return 0;
} //--------------------------------------------------------------------------- //////поиск устройств bool TUSBio::Scan(const GUID &ADeviceGuid) { DevicePathList->clear(); DeviceGuid = ADeviceGuid; bool BOOLRes = false; DWORD DWORDRes;
SetupDiDestroyDeviceInfoList(DeviceList); DeviceList = NULL;
DeviceList = SetupDiGetClassDevs(&DeviceGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (DeviceList!=INVALID_HANDLE_VALUE && DeviceList!=NULL) { QString DevicePath; int i=0; for (int i=0;; i++) { DWORDRes = GetDevicePath(DeviceGuid, i, DevicePath);
if (DWORDRes==ERROR_NO_MORE_ITEMS) { BOOLRes = true; break; }
if (DWORDRes!=0) { SetLastError(DWORDRes); break; }
DevicePathList->append(GetDevicePath(DeviceGuid, i, DevicePath)); } }
return BOOLRes; }
Когда я вызываю функцию Scan(), у меня программа зависает. Если из этих функций убрать функции Winapi, то программа не виснет.
Название: Re: USB устройства
Отправлено: Programmierer от Октября 26, 2009, 17:22
for (int i=0;; i++)
Название: Re: USB устройства
Отправлено: kibsoft от Октября 26, 2009, 17:34
;D
Название: Re: USB устройства
Отправлено: BRE от Октября 26, 2009, 17:40
А что плохого в for (int i=0;; i++)
Название: Re: USB устройства
Отправлено: Alex Custov от Октября 26, 2009, 19:24
А что плохого в for (int i=0;; i++)
Если программа зависает, видимо бесконечный цикл может быть причиной. Надо поставить небесконечный (< 32), и попробовать ещё раз.
Название: Re: USB устройства
Отправлено: BRE от Октября 26, 2009, 19:28
Если программа зависает, видимо бесконечный цикл может быть причиной. Надо поставить небесконечный (< 32), и попробовать ещё раз.
Я бы не назвал его бесконечным, внутри цикла не мало break. Правда, затрудняюсь сказать, насколько они там по-делу. ;)
Название: Re: USB устройства
Отправлено: Alex Custov от Октября 26, 2009, 19:56
Если программа зависает, видимо бесконечный цикл может быть причиной. Надо поставить небесконечный (< 32), и попробовать ещё раз.
Я бы не назвал его бесконечным, внутри цикла не мало break. Правда, затрудняюсь сказать, насколько они там по-делу. ;) По факту он бесконечен, нету условия выхода. До break-ов программа может и не добраться, и крутиться в этом цикле вечно, поэтому cтоит проверить с условием выхода:
Название: Re: USB устройства
Отправлено: BRE от Октября 26, 2009, 20:01
Я не знаток венды. Попробуй этот кусок C++ (Qt) int TUSBio::GetDevicePath(const GUID &DeviceGuid, int DeviceIndex, QString &Path) { ... SP_DEVICE_INTERFACE_DETAIL_DATA *DeviceInterfaceDetail; DeviceInterfaceDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA*) new char[RequiredSize]; DeviceInterfaceDetail->cbSize = 5; BOOLRes = SetupDiGetDeviceInterfaceDetail(DeviceList, &DeviceData, DeviceInterfaceDetail, RequiredSize, &RequiredSize, NULL); if (BOOLRes) Path = DeviceInterfaceDetail->DevicePath[0]; delete ((char*)DeviceInterfaceDetail); if (!BOOLRes) GetLastError(); return 0; }
заменить на C++ (Qt) int TUSBio::GetDevicePath(const GUID &DeviceGuid, int DeviceIndex, QString &Path) { ... SP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetail; DeviceInterfaceDetail.cbSize = 5; BOOLRes = SetupDiGetDeviceInterfaceDetail(DeviceList, &DeviceData, &DeviceInterfaceDetail, RequiredSize, &RequiredSize, NULL); if (!BOOLRes) return GetLastError(); Path = DeviceInterfaceDetail->DevicePath[0]; return 0; }
Название: Re: USB устройства
Отправлено: BRE от Октября 26, 2009, 20:04
По факту он бесконечен, нету условия выхода. До break-ов программа может и не добраться, и крутиться в этом цикле вечно, поэтому cтоит проверить с условием выхода: Если из этих функций убрать функции Winapi, то программа не виснет.
А такой цикл по факту какой? C++ (Qt) for( int i = 0; i < 32; i++ ) { i = 0; }
Название: Re: USB устройства
Отправлено: break от Октября 26, 2009, 20:32
По факту он бесконечен, нету условия выхода. Иногда очень полезно использовать циклы вроде описанного - не предполагающие условие выхода в заголовке цикла. Особенно еслди условием служит некоторая запутанная логика которую проще разложить на серию if then break; сталкивался с этим не раз.
Название: Re: USB устройства
Отправлено: Igors от Октября 26, 2009, 20:52
По факту он бесконечен, нету условия выхода. Иногда очень полезно использовать циклы вроде описанного - не предполагающие условие выхода в заголовке цикла. Особенно еслди условием служит некоторая запутанная логика которую проще разложить на серию if then break; сталкивался с этим не раз. Да "бывает у девушки муж умирает - а у вдовы живет" - но тогда чего уж мудрить с for - смысла нет, яснеее написать while (true) {..} а внутри соскочить через break или catch
Название: Re: USB устройства
Отправлено: break от Октября 26, 2009, 21:01
яснеее написать while (true) {..} так и писал - но большой разницы нет
Название: Re: USB устройства
Отправлено: BRE от Октября 26, 2009, 21:11
Да "бывает у девушки муж умирает - а у вдовы живет" - но тогда чего уж мудрить с for - смысла нет, яснеее написать while (true) {..} а внутри соскочить через break или catch
А разве C++ (Qt) while( true )
делает тоже, что и C++ (Qt) for( int i = 0; ; i++ )
По моему тут все яснее ясного.
Название: Re: USB устройства
Отправлено: Alex Custov от Октября 26, 2009, 21:19
А такой цикл по факту какой? C++ (Qt) for( int i = 0; i < 32; i++ ) { i = 0; }
Я говорил об условиях работы цикла, я считаю цикл бесконечным если условия выхода нет (контекст цикла не учитываем). Не знаю как у вас (C) :)
Название: Re: USB устройства
Отправлено: Пантер от Октября 26, 2009, 21:20
[/offtop] Давайте в другой топик на счет бесконечных циклов.
|