Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.95
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 317
#1

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

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

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

Остановка USB устройств - C++
Здраствуйте. Стоит задача: необходимо написать программу на С++, которая позволяет отследить все процессы и все что с ними связано, которые...

Почему программа выдает мусор при сортировке извлечением? - C++
Почему выдает мусор при сортировке извлечением(типо -84554515 и похожие числа),остальные нормально работают #include <stdio.h> ...

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

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

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

JMF обнаружение устройств - Java SE
Доброго времени суток. Возникла нужда-кросплатформенно вывести изображение с вебкамеры во фрейм. Скачал JMF. Использую Eclipse KEPLER...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
_arty_
29 / 28 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 10.07.2009
Сообщений: 317
27.07.2011, 17:26  [ТС] #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Директорию нужно создавать вручную командой mkdir из direct.h - функций по копированию каталогов я не встречал...
Да я думаю выжимки из исходников на шарпе возьму и допишу нормально, хотя у меня прекрасно работает в связке Autoit + C#
AutoIt умеет копировать папки....
Программа готова уже тем более, мониторит подключение дисков и считывает в массив пути, потом скопировав запускает внешний экзешник, ожидает окончания работы программы и выводит информацию о том что можно вынуть флэху....
0
-=ЮрА=-
Заблокирован
Автор FAQ
28.07.2011, 10:42 #21
>arty<, привожу премер Си проекта основанного на твоей логике обнаружения съёмных носителей.
Для создания каталога на флеш использую системную команду MKDIR. Суть работы программы следующая, при обнаружении съёмного носителя она будет пытаться создавать в его корне папку USB_DETECT в указанную папку будет скопирован файл USB_INFO.txt из каталога sTempPath
C++
1
GetTempPath(MAX_PATH,sTempPath)
/ USB_INFO.txt содержит в себе информацию о съёмном носителе полученную посредством GetVolumeInformation. Тайм-аут вызова
C++
1
GetLogicalDriveStrings(MAX_PATH,sDRIVES)
задаётся в функции
C++
1
Sleep(1000);
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <windows.h>
#include <direct.h>
#include <stdio.h>
 
void GetDrives();
void GetDriveInfo(LPCTSTR sInfoPath, LPCTSTR sDRIVE);
bool CreateDir(LPCTSTR sDRIVE, LPCTSTR sDIR, char * szPath);
 
int main()
{
    printf("PROGRAM START\r\n");
    while(true)
    {
        GetDrives();
        Sleep(1000);
    }
    return 0;
}
 
void GetDrives()
{
    char sDRIVES[MAX_PATH];
    char szPath[MAX_PATH];
    DWORD len = GetLogicalDriveStrings(MAX_PATH,sDRIVES);
    for(int i = 0; i < len; i += 4)
    {
        if(!strchr(&sDRIVES[i],'A'))
        if (GetDriveType(&sDRIVES[i]) == DRIVE_REMOVABLE)
        {
            if(CreateDir(&sDRIVES[i],"USB_DETECT",szPath))
                printf("\r\nDIR: %s CREATED\r\n",szPath);
            else
                printf("DIR: %s NOT CREATED\r\n",szPath);
            printf("\tVOLUME INFORMATION\r\n");
            GetDriveInfo(strcat(szPath,"\\USB_INFO.txt"),&sDRIVES[i]);
        }
    }
}
 
void GetDriveInfo(LPCTSTR sInfoPath, LPCTSTR sDRIVE)
{
    FILE * f;
    char sTempPath[MAX_PATH];
    char sVolName[MAX_PATH];
    char sFSysName[MAX_PATH];
    DWORD dwSerial;
    DWORD dwMaxLen;
    DWORD dwSysFlag;
    GetTempPath(MAX_PATH,sTempPath);
    if(!(f = fopen(strcat(sTempPath,"USB_INFO.txt"),"wb+")))
        printf("ERROR ACCESS %s\r\n",sInfoPath);
    else
    {
        if(GetVolumeInformation
            (
                sDRIVE,
                sVolName,
                MAX_PATH,
                &dwSerial,
                &dwMaxLen,
                &dwSysFlag,
                sFSysName,
                MAX_PATH
            )
        )
        fprintf(f,"\t%s\r\n","USB_DETECT InfoFile:");
        fprintf(f,"DRIVE   : %s\r\n",sDRIVE);
        fprintf(f,"VOLNAME : %s\r\n",sVolName);
        fprintf(f,"SERIAL# : 0x%p\r\n",dwSerial);
        fprintf(f,"MAXLEN  : 0x%p\r\n",dwMaxLen);
        fprintf(f,"FSFlag  : 0x%p\r\n",dwSysFlag);
        fprintf(f,"FSystem : %s\r\n",sFSysName);
        fclose(f);
 
        if(CopyFile(sTempPath,sInfoPath,false))
            printf(">INFOFile %s CREATED\r\n",sInfoPath);
        else
            printf(">INFOFile %s NOT CREATED\r\n",sInfoPath);
 
        printf("DRIVE   : %s\r\n",sDRIVE);
        printf("VOLNAME : %s\r\n",sVolName);
        printf("SERIAL# : 0x%p\r\n",dwSerial);
        printf("MAXLEN  : 0x%p\r\n",dwMaxLen);
        printf("FSFlag  : 0x%p\r\n",dwSysFlag);
        printf("FSystem : %s\r\n",sFSysName);
    }
}
 
bool CreateDir(LPCTSTR sDRIVE, LPCTSTR sDIR, char * szPath)
{
    bool bRet = false;
    char sCMD[MAX_PATH];
    if(szPath)
    {
        sprintf(szPath,"%s%s",sDRIVE,sDIR);
        sprintf(sCMD,"MKDIR %s",szPath);
        if(/*mkdir(szPath)*/system(sCMD))
            bRet = true;
    }
    return bRet;
 
}
1
Миниатюры
Обнаружение USB устройств с последующим их безопасным извлечением  
Вложения
Тип файла: rar USB_DETECT.exe.rar (16.5 Кб, 36 просмотров)
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 317
28.07.2011, 17:04  [ТС] #22
Спасибо -=ЮрА=-, ксатити я уже на шарпе написал функцию копирования и детектирования, как полностью закончу проект, скину....
0
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 317
29.07.2011, 19:16  [ТС] #23
Проект почти закончил, осталось последнее, мне надо сам процесс копирования файлов и бегающий прогрессбар вывести в два отдельных синхронизируемых друг с другом потока, пример кто-нибудь может дать краткий и ясный, я в шарпе новичок, читал на RSDN и MSDN, но нифига не понял...
0
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 317
29.07.2011, 21:19  [ТС] #24
Проект готов, за исключением одного: начало копирования определяется нажатием кнопки, остаётся лишь перенести действия из buttonclick в case при обнаружении устройства...

Смотрите и выкладывайте замечания, про то что я вместо invoke отключил вообще проверку на принадлежность потоков, я знаю, может кто поправит меня и сделает нормальный код с делегатами?

DirCopy.zip
0
TheDarkMax2
15 / 15 / 2
Регистрация: 23.09.2011
Сообщений: 166
23.09.2011, 16:51 #25
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Тебе нужно обработать сообщение 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;
Я вот мучаюсь, ищу уже хз сколько и всё же никак не могу понять как это делается - обработка сообщений. Можете объяснить? Просто скопировать этот текст - не работает.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.09.2011, 16:54 #26
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
ищу уже хз сколько
непонятно что вы ищите и зачем
курить литературу по ВинАпи надо
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.09.2011, 16:55 #27
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
Я вот мучаюсь, ищу уже хз сколько и всё же никак не могу понять как это делается - обработка сообщений. Можете объяснить? Просто скопировать этот текст - не работает.
- что именно хочешь узнать?Текст программы я выкладывать не буду, а вот дельным советом подскажуПонятное дело что это

Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
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;
- лишь часть кода, но по моему и так всё ясно что и к чему, чё не понятно то???
0
TheDarkMax2
15 / 15 / 2
Регистрация: 23.09.2011
Сообщений: 166
23.09.2011, 17:04 #28
Работаю в Билдере.
Не понятно как сделать, чтобы это исполнялось. Там к каждому стандартному событию привязана функция: нажал кнопку - запустил что-то. Не понятно куда писать свой код обработки сообщения. Пытался просто добавить в класс окна еще одну функцию (в .h объявляю, в .cpp сама функция), но не исполняется. Программа работает как будто её нет.

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
непонятно что вы ищите и зачем
курить литературу по ВинАпи надо
до Апи дело не доходит
Хотя... работать с устройством я могу, но Plag'n'Play не выходит. Проблема ж не в том, чтобы связаться с устройством (это я могу), а в том, чтобы делать это не в ручную нажатием кнопки, а по-человечески.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2011, 17:04
Привет! Вот еще темы с ответами:

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

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

Переодически перестают работать USB порты на материнке после подключения устройств к USB корпуса - Компьютерное железо
Собственно проблема почти описана в заголовке. Довольно странная фигня. К материнке подключены клава и мышь. Происходит такое (не...

Принтер Samsung подключен через USB вылетает вместе с "безопасным удалением" любой флешки - Принтеры, МФУ
Работает нормально, однако, вылетает вместе с &quot;безопасным удалением&quot; любой флешки. Как мне справиться с этой проблемой? Приходится каждый...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.09.2011, 17:04
Ответ Создать тему
Опции темы

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