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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как средствами Qt узнать что была подключена или отключена флешка?  (Прочитано 8643 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Декабря 21, 2015, 10:29 »

Здравствуйте, господа форумчане. Уже пару дней мучаюсь по вопросу определения подключения и отключения флешки средствами Qt. Пока вот порывшись по форумам удалось написать подобную функцию с помощью WinAPI, которая определяет, что флешка подключена или отключена и определяет ее метку.
Код:
void state_usb_flash()
{
   QString path;

   HANDLE  hDevice = CreateFileA("\\\\.\\PhysicalDrive1" , 0, 0, 0, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
   if(hDevice == INVALID_HANDLE_VALUE)
  {
      qDebug() << "\nhDevice - INVALID_HANDLE_VALUE";
  }
  else
 {
    qDebug() << "\n hDevice handle ok";
    qDebug() << " HANDLE: " << hDevice;

    int n;
    char dd[4];
    DWORD dr = GetLogicalDrives();

    for( int i = 0; i < 26; i++ )
    {
n = ((dr>>i)&0x00000001);
if( n == 1 )
{
 dd[0] =  char(65+i); dd[1] = ':'; dd[2] = '\\'; dd[3] = 0;

 path = QString("%1:\\").arg(dd[0]);

 int d;

 d = GetDriveType( path.toStdWString().c_str() );
 if( d == DRIVE_REMOVABLE )
 {
qDebug() << " Label-usb-flash: " << path << endl;
break;
 }
}
    }
  }
}
Но тут я определял наличие второго физического диска. Если он есть, определял его метку, и уже имея метку смотрел а не флешка ли это. Не совсем правильное решение, но мне оно подходит на данный момент. Также не могу пока понять по какому событию вызывать данную функцию, как поймать сам момент подключения или отключения флешки. Нашел вот здесь тему про nativeEvent: http://www.prog.org.ru/topic_25260_0.html . Может можно как-то подобным образом определить что была отключена или подключена флешка?
« Последнее редактирование: Декабря 21, 2015, 10:51 от billy4685 » Записан
supertux
Гость
« Ответ #1 : Декабря 21, 2015, 10:40 »

Попробуйте использовать LibUSBx. (домашняя страница http://libusbx.org/).
Пример:
https://fedorapeople.org/~jwrdegoede/libusb-reference/hotplug.html
« Последнее редактирование: Декабря 21, 2015, 10:44 от supertux » Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #2 : Декабря 21, 2015, 11:26 »

Попробуйте использовать LibUSBx. (домашняя страница http://libusbx.org/).
Пример:
https://fedorapeople.org/~jwrdegoede/libusb-reference/hotplug.html
А LibUSBx многоплатформенная библиотека? А то мне на данный момент нужно чтобы мое приложение шло на Windows XP/7 и на QNX6.6, в дальнейшем может понадобится и для Linux подобных. Та функция, что я написал выше, только для винды походу.
« Последнее редактирование: Декабря 21, 2015, 11:28 от billy4685 » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Декабря 21, 2015, 11:36 »

Бррр... нет, средствами Qt нельзя, оно не комбайн какой-нить. Надо искать в гугле что-то готовое или писать самому.

В Qt есть только класс QStorageInfo, но ему начхать на то, что флешка это, жестний диск, SSD, сетевой диск или виртуальный носитель.
« Последнее редактирование: Декабря 21, 2015, 11:39 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #4 : Декабря 21, 2015, 12:05 »

Бррр... нет, средствами Qt нельзя, оно не комбайн какой-нить. Надо искать в гугле что-то готовое или писать самому.

В Qt есть только класс QStorageInfo, но ему начхать на то, что флешка это, жестний диск, SSD, сетевой диск или виртуальный носитель.
Ясно, буду искать. Вот нашел статью: http://wiki.kucia.net/doku.php?id=projects:qtusb . Буду разбираться.
Записан
supertux
Гость
« Ответ #5 : Декабря 21, 2015, 12:13 »

LibUSBx под linux и windows работает точно.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #6 : Декабря 21, 2015, 12:33 »

Бррр... нет, средствами Qt нельзя, оно не комбайн какой-нить. Надо искать в гугле что-то готовое или писать самому.

В Qt есть только класс QStorageInfo, но ему начхать на то, что флешка это, жестний диск, SSD, сетевой диск или виртуальный носитель.
У меня в Qt 5.3.2 вообще не находит класс QStorageInfo (не инклудится), хотя в справке находит его описание.
Записан
supertux
Гость
« Ответ #7 : Декабря 21, 2015, 15:52 »

QStorageInfo присутствует в версиях 5.4+. Так на оффсайте написано.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #8 : Декабря 21, 2015, 17:20 »

QStorageInfo присутствует в версиях 5.4+. Так на оффсайте написано.
Странно, но в версии Qt5.4.1 mingw под Windows 7 тоже не нашел ее. Может где-то в дебрях спрячена, так как на #include <QStorageInfo> било ошибку.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #9 : Декабря 21, 2015, 17:22 »

Начал вот по немногу разбираться с libusb под Windows. Не могу теперь найти как узнать метку подключенной флешки с помощью этой библиотеки. Может кто видел примеры подобные?
« Последнее редактирование: Декабря 21, 2015, 17:24 от billy4685 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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