Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/28: Рейтинг темы: голосов - 28, средняя оценка - 4.68
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
1

Обнаружение USB устройств с последующим их безопасным извлечением

22.07.2011, 17:45. Просмотров 5339. Ответов 27
Метки нет (Все метки)

Интересует вопрос об обнаружении съёмных накопителей (usb-flash), с последующим копированием на них и извлечением, прошу в гугл не посылать, т.к. объяснений кода от него не дождёшься, хотелось бы получить внятное разъяснение, помогите кто чем может
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2011, 17:45
Ответы с готовыми решениями:

Обнаружение устройств usb
Нужно сделать так, чтобы при подключении любого устройства по usb выполнялся код. Пытался найти...

Заполнение массива словами, сохранение их в файл с последующим их извлечением
Собственно смотрим заголовок, помогите. Хотелось бы увидеть больше объяснения а не кода. Заранее...

Сохранение изображения jpg/png в базу данных средствами С++ и WinAPI с последующим извлечением оного из БД
Можно ли с использованием C++ на winApi сохранить изображение (png,jpeg) в какую нибудь переменную...

Неполадки с извлечением флешки USB
Почему после сообщения "Оборудование может быть удалено" огонёк на флешке продолжает светиться?...

JMF обнаружение устройств
Доброго времени суток. Возникла нужда-кросплатформенно вывести изображение с вебкамеры во фрейм....

27
fasked
Эксперт С++
5001 / 2580 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
22.07.2011, 17:45 2
>arty<, система-то хоть какая?
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
22.07.2011, 18:27  [ТС] 3
Цитата Сообщение от fasked Посмотреть сообщение
>arty<, система-то хоть какая?
Windows XP
0
jonson
236 / 209 / 84
Регистрация: 18.03.2010
Сообщений: 750
22.07.2011, 18:40 4
>arty<, GetLogicalDriveStrings и GetDriveType тебе в помощь.
2
22.07.2011, 18:40
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
22.07.2011, 20:20  [ТС] 5
Вообщем кое что накопал и сделал, но проблема в том что я хочу построчно копировать путь к диску в Memo->lines->addstrings.
Проблема в несовместимости форматов, ругается мол метод addstrings просит Tstrings, а я ему char комрлю, так вот как его переконвертировать?
Код ниже предствлен на CodeGear 2009 C++, это обычная форма с кнопкой и мемо...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include <stdio.h>
#include <cstring.h>
#include "kiosk_src.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;
using namespace System;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{  char szBuffer[256];
 
        GetLogicalDriveStrings(256, szBuffer);
        char * pch = szBuffer;
        while (*pch) {
         Memo1->Lines->Text = pch;
      pch = &pch[strlen(pch) + 1];
   }
     if (GetDriveType("G:")==DRIVE_REMOVABLE) {ShowMessage("OK");}
 
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
22.07.2011, 22:09 6
Тебе нужно обработать сообщение DWM_DEVICECHANGE вот те кусок кода и готовый проект
C++
1
2
3
4
5
6
7
8
LRESULT CRmv_guardDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    // TODO: Add your specialized code here and/or call the base class
    switch(message){
    case WM_DEVICECHANGE:
        if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam ) 
            UpdateDevice((PDEV_BROADCAST_HDR)lParam, wParam);
        break;
1
Вложения
Тип файла: rar rmv_guard.rar (22.2 Кб, 86 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
22.07.2011, 22:11 7
PS:Чтобы определять устройства в режиме реального времени, тебе прийдётся постоянно вызывать
C++
1
GetLogicalDriveStrings
, и твоя программа будет достаточно сильно грузить проц, при частоте обновлений меньше секунды...
0
jonson
236 / 209 / 84
Регистрация: 18.03.2010
Сообщений: 750
22.07.2011, 22:23 8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
и твоя программа будет достаточно сильно грузить проц, при частоте обновлений меньше секунды..
-=ЮрА=-, это не есть так. Даже при селероне в 1.8GHz обновлял 60 раз в сек, и ни какой загрузки не наблюдал вообще.
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
22.07.2011, 22:45  [ТС] 9
И так, вроде как разобрался с обнаружением устройства, определением его типа, теперь бы извлечение не могли подсказать как сделать, ну и конечно безопасное чтобы флэхи не сжечь ))

KIOSK.zip
0
-=ЮрА=-
Заблокирован
Автор FAQ
22.07.2011, 22:48 10
Думаю можно сгенерировать
C++
1
SendMessage(WM_DEVICECHANGE,DBT_DEVICEREMOVECOMPLETE,NULL)
Надо будет на досуге и самому попробовать
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
23.07.2011, 12:22  [ТС] 11
нашёл функцию CM_Request_Device_Eject, вроде как посылает устройству сообщение о том, что надо бы отключится перед этим закрыв все открытые дескрипторы, т.е. безопасно, но она требует хэндл устройства, а у меня уже буква известна, прога перебирает все устройства и проверяет не флэшка ли это, тем самым записывает в листбокс букву съёмного диска, так вот как имея букву диска получить хэндл устройства и извлечь его?
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
23.07.2011, 14:17  [ТС] 12
Изменил код, но немогу понять почему функция CreateFile не может открыть устройство и получить его хэндл:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include <iostream.h>
#include<stdio.h>
#include <cstring.h>
#include <time.h>
#include <setupapi.h>
#include "kiosk_src.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;
using namespace System;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char szBuffer[256];
 char fName[100];
 HANDLE hF;
 
        GetLogicalDriveStrings(256, szBuffer);
        char * pch = szBuffer;
        while (*pch) {
        if (GetDriveType(pch)==DRIVE_REMOVABLE) {ListBox1->Items->Add(pch); strcpy(fName,pch);}
         Memo1->Lines->Add(pch);
      pch = &pch[strlen(pch) + 1];
   }
      hF = CreateFile(fName,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(hF==INVALID_HANDLE_VALUE) MessageBox(NULL, TEXT("Нельзя открыть файл!"), TEXT("KIOSK"), 0);
 
 
    }
KIOSK.zip
0
fasked
Эксперт С++
5001 / 2580 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.07.2011, 07:24 13
Цитата Сообщение от >arty< Посмотреть сообщение
почему функция CreateFile не может открыть устройство и получить его хэндл
Попробуйте запустить Вашу программу с правами администратора.
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
25.07.2011, 17:58  [ТС] 14
Цитата Сообщение от fasked Посмотреть сообщение
Попробуйте запустить Вашу программу с правами администратора.
Так я и так из под админа работаю...
И проблема не в этом, а вот в этом \\\\.\\N:
Функция воспринимает только такой формат, а как его получить я незнаю...
0
fasked
Эксперт С++
5001 / 2580 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.07.2011, 18:47 15
>arty<, sprintf в помощь
C
1
2
3
4
char drive_string[7];
char drive_letter = 'N';
 
sprintf(drive_string, "\\\\.\\%c:", drive_letter);
1
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
25.07.2011, 20:32  [ТС] 16
спасибо, но я уже переписал приложение на делфях где уйма примеров, просто хотелось на C++.
Но не мучатся же, мне нужно приложение которое будет копировать заданную папку на флэху, а после завершения операции извлекать, вот и всё....
Но я на C++ написание данной программы не заброшу, постараюсь сделать клон и отпишусь сюда с готовым кодом....
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.07.2011, 11:39 17
Если нужно что то перенести на флеш то проще всего использовать функцию СopyFile и не мучаться!
C++
1
if(CopyFile(sPath + "\\test.txt",pRmvPath,false))
Я так понял суть программы в том чтобы при обнаружении флеш на неё что то записать с компа?Похожее реализовывал, только как и писал раньше копать лучше в сторону WM_DEVICECHANGE и их отлову, этим можно с флешью работать ещё до того как с ней начнёт работать эксплорер...
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
26.07.2011, 16:53  [ТС] 18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если нужно что то перенести на флеш то проще всего использовать функцию СopyFile и не мучаться!
C++
1
if(CopyFile(sPath + "\\test.txt",pRmvPath,false))
Я так понял суть программы в том чтобы при обнаружении флеш на неё что то записать с компа?Похожее реализовывал, только как и писал раньше копать лучше в сторону WM_DEVICECHANGE и их отлову, этим можно с флешью работать ещё до того как с ней начнёт работать эксплорер...
А разве функция CopyFile умеет копировать директории и поддиректории?
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2011, 13:32 19
Директорию нужно создавать вручную командой mkdir из direct.h - функций по копированию каталогов я не встречал...
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
27.07.2011, 17:26  [ТС] 20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Директорию нужно создавать вручную командой mkdir из direct.h - функций по копированию каталогов я не встречал...
Да я думаю выжимки из исходников на шарпе возьму и допишу нормально, хотя у меня прекрасно работает в связке Autoit + C#
AutoIt умеет копировать папки....
Программа готова уже тем более, мониторит подключение дисков и считывает в массив пути, потом скопировав запускает внешний экзешник, ожидает окончания работы программы и выводит информацию о том что можно вынуть флэху....
0
27.07.2011, 17:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2011, 17:26

работа с потоками и обнаружение устройств
добрый день, господа. 1) При разработке программы морда стала немного притормаживать на пк. В ней...

Обнаружение новых устройств на последовательной шине
Доброго времени суток, форумчане. Есть некоторая система, состоящая из ведущих и ведомых...

Обнаружение компьютеров и устройств подключенных по сети
Как реализовать обнаружение компьютеров и устройств подключенных по сети? просто выдать список...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru