Russian Qt Forum
Ноябрь 23, 2024, 08:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: USB устройства  (Прочитано 13971 раз)
Vera
Гость
« : Октябрь 23, 2009, 14:50 »

Всем здравствуйте!
Столкнулась с проблемой построения списка USB-устройств и открытия какого-либо из них... Пыталась сделать это через Winapi-функции, но почему-то прога в время обращения к этим функциям виснет. Можно ли сделать это только лишь средствами Qt?
PS пишите плз для дураков.. я начинающий программист в этой сфере Строит глазки
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 23, 2009, 16:04 »

В Qt для этого нет средств, так что только WinApi. Запости сюда свой код, может кто и поможет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Vera
Гость
« Ответ #2 : Октябрь 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, то программа не виснет.
Записан
Programmierer
Гость
« Ответ #3 : Октябрь 26, 2009, 17:22 »

for (int i=0;; i++)
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #4 : Октябрь 26, 2009, 17:34 »

 Смеющийся
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
BRE
Гость
« Ответ #5 : Октябрь 26, 2009, 17:40 »

А что плохого в
for (int i=0;; i++)
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Октябрь 26, 2009, 19:24 »

А что плохого в
for (int i=0;; i++)

Если программа зависает, видимо бесконечный цикл может быть причиной. Надо поставить небесконечный (< 32), и попробовать ещё раз.
Записан
BRE
Гость
« Ответ #7 : Октябрь 26, 2009, 19:28 »

Если программа зависает, видимо бесконечный цикл может быть причиной. Надо поставить небесконечный (< 32), и попробовать ещё раз.
Я бы не назвал его бесконечным, внутри цикла не мало break.
Правда, затрудняюсь сказать, насколько они там по-делу.  Подмигивающий
« Последнее редактирование: Октябрь 26, 2009, 19:37 от BRE » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Октябрь 26, 2009, 19:56 »

Если программа зависает, видимо бесконечный цикл может быть причиной. Надо поставить небесконечный (< 32), и попробовать ещё раз.
Я бы не назвал его бесконечным, внутри цикла не мало break.
Правда, затрудняюсь сказать, насколько они там по-делу.  Подмигивающий

По факту он бесконечен, нету условия выхода.

До break-ов программа может и не добраться, и крутиться в этом цикле вечно, поэтому cтоит проверить с условием выхода:

Код:
for (int i=0;i < 32;i++)
Записан
BRE
Гость
« Ответ #9 : Октябрь 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;
}
 
Записан
BRE
Гость
« Ответ #10 : Октябрь 26, 2009, 20:04 »

По факту он бесконечен, нету условия выхода.
До break-ов программа может и не добраться, и крутиться в этом цикле вечно, поэтому cтоит проверить с условием выхода:
Код:
for (int i=0;i < 32;i++)

Если из этих функций убрать функции Winapi, то программа не виснет.

А такой цикл по факту какой?
Код
C++ (Qt)
for( int i = 0; i < 32; i++ )
{
   i = 0;
}
 
« Последнее редактирование: Октябрь 26, 2009, 20:06 от BRE » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #11 : Октябрь 26, 2009, 20:32 »

Цитировать
По факту он бесконечен, нету условия выхода.
Иногда очень полезно использовать циклы вроде описанного - не предполагающие условие выхода в заголовке цикла.
Особенно еслди условием служит некоторая запутанная логика которую проще разложить на серию if then break; сталкивался с этим не раз.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Октябрь 26, 2009, 20:52 »

Цитировать
По факту он бесконечен, нету условия выхода.
Иногда очень полезно использовать циклы вроде описанного - не предполагающие условие выхода в заголовке цикла.
Особенно еслди условием служит некоторая запутанная логика которую проще разложить на серию if then break; сталкивался с этим не раз.
Да "бывает у девушки муж умирает - а у вдовы живет" - но тогда чего уж мудрить с for - смысла нет, яснеее написать while (true) {..} а внутри соскочить через break или catch
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #13 : Октябрь 26, 2009, 21:01 »

Цитировать
яснеее написать while (true) {..}
так и писал - но большой разницы нет
Записан
BRE
Гость
« Ответ #14 : Октябрь 26, 2009, 21:11 »

Да "бывает у девушки муж умирает - а у вдовы живет" - но тогда чего уж мудрить с for - смысла нет, яснеее написать while (true) {..} а внутри соскочить через break или catch
А разве
Код
C++ (Qt)
while( true )
делает тоже, что и
Код
C++ (Qt)
for( int i = 0; ; i++ )

По моему тут все яснее ясного.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.18 секунд. Запросов: 22.