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

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

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

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

22.07.2011, 17:45. Просмотров 4723. Ответов 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...

27
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
22.07.2011, 17:45 #2
>arty<, система-то хоть какая?
0
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 317
22.07.2011, 18:27  [ТС] #3
Цитата Сообщение от fasked Посмотреть сообщение
>arty<, система-то хоть какая?
Windows XP
0
jonson
233 / 206 / 61
Регистрация: 18.03.2010
Сообщений: 750
22.07.2011, 18:40 #4
>arty<, GetLogicalDriveStrings и GetDriveType тебе в помощь.
2
_arty_
29 / 28 / 1
Регистрация: 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 Кб, 83 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
22.07.2011, 22:11 #7
PS:Чтобы определять устройства в режиме реального времени, тебе прийдётся постоянно вызывать
C++
1
GetLogicalDriveStrings
, и твоя программа будет достаточно сильно грузить проц, при частоте обновлений меньше секунды...
0
jonson
233 / 206 / 61
Регистрация: 18.03.2010
Сообщений: 750
22.07.2011, 22:23 #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
и твоя программа будет достаточно сильно грузить проц, при частоте обновлений меньше секунды..
-=ЮрА=-, это не есть так. Даже при селероне в 1.8GHz обновлял 60 раз в сек, и ни какой загрузки не наблюдал вообще.
0
_arty_
29 / 28 / 1
Регистрация: 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 / 1
Регистрация: 10.07.2009
Сообщений: 317
23.07.2011, 12:22  [ТС] #11
нашёл функцию CM_Request_Device_Eject, вроде как посылает устройству сообщение о том, что надо бы отключится перед этим закрыв все открытые дескрипторы, т.е. безопасно, но она требует хэндл устройства, а у меня уже буква известна, прога перебирает все устройства и проверяет не флэшка ли это, тем самым записывает в листбокс букву съёмного диска, так вот как имея букву диска получить хэндл устройства и извлечь его?
0
_arty_
29 / 28 / 1
Регистрация: 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
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.07.2011, 07:24 #13
Цитата Сообщение от >arty< Посмотреть сообщение
почему функция CreateFile не может открыть устройство и получить его хэндл
Попробуйте запустить Вашу программу с правами администратора.
0
_arty_
29 / 28 / 1
Регистрация: 10.07.2009
Сообщений: 317
25.07.2011, 17:58  [ТС] #14
Цитата Сообщение от fasked Посмотреть сообщение
Попробуйте запустить Вашу программу с правами администратора.
Так я и так из под админа работаю...
И проблема не в этом, а вот в этом \\\\.\\N:
Функция воспринимает только такой формат, а как его получить я незнаю...
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2011, 18:47
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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