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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как средствами Qt узнать что была подключена или отключена флешка?  (Прочитано 8357 раз)
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.053 секунд. Запросов: 23.