crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Vera
  опции профиля:
сообщение 23.10.2009, 14:36
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 23.10.2009
Пользователь №: 1174

Спасибо сказали: 0 раз(а)




Репутация:   0  


Возникла задача построение списка подключенных компьютеру USB-устройств и открытие какого-нибудь устройства из данного списка. Есть программа, написанная на C++ для Windows. Она основана на использовании функций Winapi. Когда переписывали эту программу в Qt, выяснилось, что Qt не видит тела winapi-шных функций. т.е. он не выдает ошибку, но виснет во время обращения к ним.
Есть ли у Qt какие-нибудь свои функции для работы с USB-устройствами?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Vera
  опции профиля:
сообщение 23.10.2009, 15:12
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 23.10.2009
Пользователь №: 1174

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть вот такой класс для работы с 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, то программа не виснет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 2:18