Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/33: Рейтинг темы: голосов - 33, средняя оценка - 4.52
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1

Как в потоке организовать открытие флешки

25.05.2012, 00:43. Показов 6214. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как уже все слышали у меня есть 2 проблемы
1)Открытие проводника при подключении флэшки (на XP) на 7 всё ок, Xp не может быстро сооброзить
2)Программа удаляет файлы с флэшки до появления флэшки в проводнике, и как только флэшка появляется в проводнике другая программа заново их копирует на флэшку, а мне нужно их удалить)
Ставить на таймер как то не профессионально :| гыыы, умные люди советуют в поток...
Как создать какой-нить элементарный поток(Thread например),также в потоке организовать открытие флешки чтоб все шло по порядку а все значения передавались после открытия например.
А как его реализовать то???
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2012, 00:43
Ответы с готовыми решениями:

Как организовать открытие другой формы в соответствии поставленого флажка
Всем привет. Как организовать открытие другой формы в соответствии поставленого флажка Пример Форма А - Форма Б -

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

Открытие формы в отдельном потоке
Добрый день, такой вопрос: имеется главная форма, на ней кнопка, которая делает любую длительную операцию. Создал отдельную форму на ней...

77
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
29.05.2012, 14:50  [ТС]
Студворк — интернет-сервис помощи студентам
LK может вы что нибудь подскажите как это лучше реализовать?

Добавлено через 18 часов 22 минуты
голова треснет, нужно следить за проводником, его активностью....нужен цикл который будет пробовать открыть покуда не откроет,
C++
1
2
3
4
if(GetDriveType(Edit1->Text) == DRIVE_NO_ROOT_DIR)(или что то вроде этого
повторить команду много много раз)
else
 открыть диск) и остановить проверку
или
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ProgressBar1->Position = 0;
char disk[100];
strcpy( disk, Edit1->Text.c_str( ) );
bool ready = false;
do {
        ready=DirectoryExists(disk); // ïûòàåìcÿ îòêðûòü êîðíåâóþ äèðåêòîðèþ
        Application->ProcessMessages();
} while (!ready);
try {
        ShellExecute( Handle, "open", disk, NULL, NULL, SW_RESTORE );
        dt = Now( ); // ôîðìàò äàòû
        Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Îòêðûò äèñê: " + "(" + Edit1->Text.SubString(1,2) +")" );
        ProgressBar1->Position = 100;
} catch (...) {
 ещё раз и раз стучу к диску;}
Просто без этих функций моя дипломка не рабочая выходит...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.05.2012, 18:08
Цитата Сообщение от EdarGp Посмотреть сообщение
LK может вы что нибудь
может быть, может быть...
А ловить системные сообщения без цикла нельзя? Где-то уже было и не раз про WM_DeviceChange .
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.05.2012, 18:14
LK, у него на XP DeviceChange как-то неправильно срабатывает вроде как...
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
29.05.2012, 19:36  [ТС]
LK, на xp задержка....около секунды или трёх...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.05.2012, 20:23
EdarGp, дык, это не смертельно в данном случае - пишем письмо пользователю в стиле "Анализ системных служб. Ждите.", что, наверное, не такая уж и ложь , тоже, в данном случае.

И я не помню, от чего у вас задержка.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.05.2012, 20:58
"Анализ системных служб. Ждите.", что, наверное, не такая уж и ложь
Ага так почти безпаливн... сразу после открытия проводника...
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
30.05.2012, 00:34  [ТС]
LK,
Цитата Сообщение от Avazart Посмотреть сообщение
DeviceChange
видит диск но делает его доступным через 1-3 секунды...
если я на DeviceChange вешаю открытие диска он не откроет, нужно ждать 3 секунды и открывать его
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
31.05.2012, 22:49  [ТС]
Цитата Сообщение от EdarGp Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ProgressBar1->Position = 0;
char disk[100];
strcpy( disk, Edit1->Text.c_str( ) );
bool ready = false;
do {
 ready=DirectoryExists(disk); // пытаемcя открыть корневую директорию
 Application->ProcessMessages();
} while (!ready);
try {
 ShellExecute( Handle, "open", disk, NULL, NULL, SW_RESTORE );
 dt = Now( ); // формат даты
 Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Открыт диск: " + "(" + Edit1->Text.SubString(1,2) +")" );
 ProgressBar1->Position = 100;
} catch (...) {
 ещё раз и раз стучу к диску;}
Так не работает (на Xp равно ошибка), добры люди помогите.
Ошибка Диск не найден! Жму окай, 2 секунды и он появляется в проводнике.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
31.05.2012, 22:57
Значит, срабатывает ваш следующий код стука, которого здесь нет.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
31.05.2012, 23:38  [ТС]
LK,

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
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 ) {
        char DiskLabel[MAX_PATH];   //метка диска
        WORD OldErrorMode;  //отключаем показ ошибок
        AnsiString disk;   //переменная disk типа  AnsiString
        DWORD dr = GetLogicalDrives( );  // функция возвращает битовую маску
        for ( int x = 1; x < 26; x++ ) { // проходимся циклом по битам
            if ( ( dr >> x ) & 1 ) {     // узнаём значение текущего бита, если единица - диск с номером x есть
                disk = AnsiString( ( char )( 65 + x ) ) + "://"; // получаем литеру диска
                OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS ); // убираем показ ошибок
                bool ready = DirectoryExists(disk); // пытаемcя открыть корневую директорию
                if (ready)
                {   // пытаемcя открыть корневую директорию
                    UINT DriveType = GetDriveType( disk.c_str( ) ); // получаем тип диска
                    if ( DriveType != DRIVE_CDROM & // исключаем CDROMы
                            DriveType != DRIVE_FIXED & // исключаем  HDD
                            DriveType != DRIVE_RAMDISK &  // исключаем  Ram disk
                            DriveType != DRIVE_REMOTE &     //исключаем FDD
                            DriveType != DRIVE_NO_ROOT_DIR &    //исключаем повреждённые диски
                            DriveType != DRIVE_UNKNOWN)       //исключаем неизвестные диски
                    {
                    PlaySoundW( L"alert.wav", 0, SND_ASYNC );   //проигрываем звук
                            GetVolumeInformation( disk.c_str( ), DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0 );    //получаем Имя диска
                            // для отчета
                            dt = Now( ); // полный формат даты
                            Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) +
                                             " " + " - " + " Подключен накопитель: " "(" + ( disk.SubString(1,2) ) +
                                             ")" + " " + DiskLabel + "" );     //указываем в Лог время,дату, имя диска.
                        Edit1->Text=disk;         //результат в Edit1
                            Button6->Click();     //жмяк на кпопку
                        }
+ на Button6->Click();

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ProgressBar1->Position = 0;
char disk[100];
strcpy( disk, Edit1->Text.c_str( ) );
bool ready = false;
do {
 ready=DirectoryExists(disk); // пытаемcя открыть корневую директорию
 Application->ProcessMessages();
} while (!ready);
try {
 ShellExecute( Handle, "open", disk, NULL, NULL, SW_RESTORE );
 dt = Now( ); // формат даты
 Log->Lines->Add( DateToStr( dt ) + " " + TimeToStr( dt ) + " " + " - " + "Открыт диск: " + "(" + Edit1->Text.SubString(1,2) +")" );
 ProgressBar1->Position = 100;
} catch (...) {
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.06.2012, 12:18  [ТС]
Вот и я)Доброго дня всем) Идей нет по повод моей проблемы?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
10.06.2012, 12:24
Многопотоковость и THREAD...
1
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
10.06.2012, 13:12
вопрос из этой серии:
"Вопросы комплексной защиты от Autorun-вирусов на флешках"
"Ограничение на использование USB-накопителей"
более подробная
во второй ссылке тебя должен интересовать больше такой момент:
Запрет записи на USB-устройство.
HKLM\SYSTEM\CurrentControlSet\control\St orageDevicePolicies.
Параметр «WriteProtect» — скорей всего его нет. Тогда его нужно создать с типом «dword» и присвоить значение «1». И не забыть перегрузить компьютер. Чтобы восстановить — присвоить значение «0».

единственный момент как это сделать динамически без перезагрузки... если можно было бы реализовать программно блокирование флешки на запись то эт решит все твои проблемы
2
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.06.2012, 13:23  [ТС]
QWIPQ, это я всё знаю, во время тестирования нашли баги
1)Автоматически открыть флэшку в проводнике на Win Xp не возможно с кодом
C++
1
2
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 ) {
так как мы получаем имя диска, путь и т.д , но для проводника она ещё не готова...
2)Если Win Xp заражена вирусом, тогда на автомате флэшка не ловится.... только при повторном ручном сканировании
3)Win 7 и Xp Если на Пк есть вирус он повторно заражает флэшку так как этим кодом я ловлю и удаляю всю нечисть
C++
1
2
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 ) {
потом флэшка появляется в проводнике и повторно заражается)
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
10.06.2012, 13:24
P.S. не во всех источниках говорится про перезагрузку компа... нужно попробывать без перезагрузки сделать эту операцию... в итоге если все гуд своей прогой ты сможет открывать или загрывать права на запись на флешку...

Цитата Сообщение от EdarGp Посмотреть сообщение
потом флэшка появляется в проводнике и повторно заражается)
ну так что тебе мешает прежде чем тыкать в комп что нипоподя политику записи изменить своей программой??? - момент требует тестирования, но как возможность оч интересен... а после того подключил флеху и тебе на неё над чет дописать меняешь политику обратно на доступ, а после своим кодом сперва отключаешь запись потом чистишь нечисть

Но не открывает флэшку в проводнике при её подключении
P.S. хм, над покумекать еще)
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.06.2012, 13:30  [ТС]
QWIPQ, мне не нужен запрет на запись
У меня практически всё работает
Но не открывает флэшку в проводнике при её подключении, повторить функцию удаления в течении допустим 15 секунд без тормозов... ну и всё)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.06.2012, 13:39
Где то слышал что можно защитить флешку путем создания на ней папок и файлов с именами такими же какие и у файлов вируса только изменив атрибуты так что бы их нельзя было изменять - т.е вирус попросту не сможет создать свои файлы из-за этого....

Добавлено через 4 минуты
А вот же есть тут...

Создается bat-файл (например, с именем flashprotect.bat(см. вложение)) и следующим содержимым:
Code
1
2
3
4
5
attrib -s -h -r autorun.*
del autorun.*
mkdir %~d0AUTORUN.INF
mkdir "?%~d0AUTORUN.INF.."
attrib +s +h %~d0AUTORUN.INF
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.06.2012, 13:39  [ТС]
Avazart, да, я это реализовывал уже...
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
10.06.2012, 13:43
ну есть еще способ кроме этого сделать защитный файл который сжирает все свободное место на флешке... в итоге вирус просто не сможет копироваться... создать как Avazart предлагает файл авторан и чтоб он весил все свободное место на флешке...
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
10.06.2012, 13:49  [ТС]
QWIPQ, а если я на флэшку то скопировать сам хочу?)И место занято всё)Если освобожу вирус с копируется на флэшку )так как в процессах он
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2012, 13:49
Помогаю со студенческими работами здесь

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

Ярлык на открытие флешки
Здравствуйте уважаемые специалисты CyberForum. Благодарю за вашу бесценную работу. Прошу описать вкратце логику создания...

открытие с файла с флешки
проблема такая открываю проект с флещки в студио 2010 она запустилась,но синий экран почему то самого кода не видно,что нужно сделать

Как получить значение переменной созданной в потоке, в другом потоке?
Добрый день :) Возник такой вопрос &quot;как получить значение переменной созданной в потоке, в другом потоке?&quot; Не знаю, как правильно...

Ошибка флешки - Ярлык на открытие флешке в самой ней!
У меня на флешке какойто странный вирус!!! Открываю я флешку через мой комп*ютер, там внутри ярлык на эту же флешку...когда я его открываю...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru