29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317

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

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

Студворк — интернет-сервис помощи студентам
Интересует вопрос об обнаружении съёмных накопителей (usb-flash), с последующим копированием на них и извлечением, прошу в гугл не посылать, т.к. объяснений кода от него не дождёшься, хотелось бы получить внятное разъяснение, помогите кто чем может
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2011, 17:45
Ответы с готовыми решениями:

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

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

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

27
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
28.07.2011, 10:42
Студворк — интернет-сервис помощи студентам
>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;
 
}
Миниатюры
Обнаружение USB устройств с последующим их безопасным извлечением  
Вложения
Тип файла: rar USB_DETECT.exe.rar (16.5 Кб, 46 просмотров)
1
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
28.07.2011, 17:04  [ТС]
Спасибо -=ЮрА=-, ксатити я уже на шарпе написал функцию копирования и детектирования, как полностью закончу проект, скину....
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
29.07.2011, 19:16  [ТС]
Проект почти закончил, осталось последнее, мне надо сам процесс копирования файлов и бегающий прогрессбар вывести в два отдельных синхронизируемых друг с другом потока, пример кто-нибудь может дать краткий и ясный, я в шарпе новичок, читал на RSDN и MSDN, но нифига не понял...
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
29.07.2011, 21:19  [ТС]
Проект готов, за исключением одного: начало копирования определяется нажатием кнопки, остаётся лишь перенести действия из buttonclick в case при обнаружении устройства...

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

DirCopy.zip
0
UeArtemis
18 / 18 / 3
Регистрация: 23.09.2011
Сообщений: 205
23.09.2011, 16:51
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Тебе нужно обработать сообщение 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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
23.09.2011, 16:54
Цитата Сообщение от TheDarkMax2 Посмотреть сообщение
ищу уже хз сколько
непонятно что вы ищите и зачем
курить литературу по ВинАпи надо
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.09.2011, 16:55
Цитата Сообщение от 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
UeArtemis
18 / 18 / 3
Регистрация: 23.09.2011
Сообщений: 205
23.09.2011, 17:04
Работаю в Билдере.
Не понятно как сделать, чтобы это исполнялось. Там к каждому стандартному событию привязана функция: нажал кнопку - запустил что-то. Не понятно куда писать свой код обработки сообщения. Пытался просто добавить в класс окна еще одну функцию (в .h объявляю, в .cpp сама функция), но не исполняется. Программа работает как будто её нет.

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
непонятно что вы ищите и зачем
курить литературу по ВинАпи надо
до Апи дело не доходит
Хотя... работать с устройством я могу, но Plag'n'Play не выходит. Проблема ж не в том, чтобы связаться с устройством (это я могу), а в том, чтобы делать это не в ручную нажатием кнопки, а по-человечески.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2011, 17:04

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

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

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

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

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


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

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

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru