crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> USB устройства
Vera
  опции профиля:
сообщение 23.10.2009, 14:36
Сообщение #1


Новичок


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

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




Репутация:   0  


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


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Не понял, что значит не видит?
Думается мне, что вы что-то не так делаете. Просто гляньте в исходники Qt, там не мало чисто виндового Api используется...
В крайнем случае можно весь функционал по работе с USB упаковать в DLL, которую в свою очередь можно подгружать, когда нужда будет.

Если интересно, то можно попробовать использовать библиотеку libUsb:
libusb - библиотека для работы под Linux (2.2, 2.4 и выше), FreeBSD, NetBSD и OpenBSD, Darwin/MacOS X
libusb-win32 - порт libusb для винды.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vera
  опции профиля:
сообщение 23.10.2009, 15:12
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 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, то программа не виснет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 23.10.2009, 15:38
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Посмотрите в дебаге, на какой именно функции зависает. Если умеете, то зайдите внутрь той функции, думаю тогда станет ясно из-за чего именно зависает.

Вы этот класс в winapi консоли например попробуйте, работает нормально или нет? Если нет, то дебаг и доки в помощь или библиотеки, которые я предложил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.10.2009, 21:11
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Vera @ 23.10.2009, 18:36) *
Есть ли у Qt какие-нибудь свои функции для работы с USB-устройствами?
Нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 24.10.2009, 21:36
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

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




Репутация:   1  


У меня возникала похожая задача. Более точно-1) определять момент втыкания/извлечения флешки, 2)проверять, на каком носителе (USB или обычный жёсткий диск) находится файл. Решение сделал на основе вот этого:
http://www.codeproject.com/KB/winsdk/usbdisks.aspx
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Vera
  опции профиля:
сообщение 26.10.2009, 17:12
Сообщение #7


Новичок


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

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




Репутация:   0  


Цитата(ViGOur @ 23.10.2009, 16:38) *
Посмотрите в дебаге, на какой именно функции зависает. Если умеете, то зайдите внутрь той функции, думаю тогда станет ясно из-за чего именно зависает.


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

Цитата(ViGOur @ 23.10.2009, 16:38) *
Вы этот класс в winapi консоли например попробуйте, работает нормально или нет? Если нет, то дебаг и доки в помощь или библиотеки, которые я предложил.


Этот класс замечательно работает в с++, там никаких проблем не возникало
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 28.10.2009, 9:23
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

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




Репутация:   1  


Вот что у меня получилось...
В MyApp на все случаи жизни расписано событие WM_DEVICECHANGE
Класс QRichFileInfo позволяет получать информацию о местонахождении файла.
Прикрепленные файлы
Прикрепленный файл  myapp.zip ( 3,23 килобайт ) Кол-во скачиваний: 204
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.11.2024, 13:44