Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Безопасное извлечение устройства, не удаляя букву диска

17.05.2023, 08:53. Показов 1157. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно безопасное извлечение устройства, не удаляя букву диска, точно так же как если нажать правой кнопкой мыши на диск и выбрать Извлечь. Код у меня есть, но он работает только в семёрке и выше а мне хотелось бы ещё и в XP. Плюс мне хотелось бы на чистом API.

Добавлено через 1 минуту
А вот кстати и этот код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
' Извлечение диска (USB или CD/DVD), при этом буква диска остаётся (только для Win 7)
Public Sub EjectDriveWMI(DriveLetter As String)
    Dim Obj As Object
    
    Set Obj = CreateObject("Shell.Application")
    
    Obj.Namespace(ssfDRIVES).ParseName(DriveLetter + ":\").InvokeVerb ("Eject")
    
    Set Obj = Nothing
End Sub
Но мне очень хотелось бы чтобы работало и в XP тоже. И желательно на чистом API, а не WMI.

Добавлено через 1 минуту
Кстати я даже не знаю Shell.Application это вообще WMI или нет... Не суть, в XP не пашет...

Добавлено через 10 минут
У меня ещё есть API конечно же CM_Request_Device_EjectA но он безопасно извлекает устройство и к сожалению сразу удаляет букву диска. А мне иногда надо, чтобы не удаляло букву диска (особенно когда это CardReader у меня).
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2023, 08:53
Ответы с готовыми решениями:

Безопасное извлечение устройства
Всем доброго времеи суток ! Проблема в том что функция безопасное извлечение устройства не хочет работать. Сам значёк отображается, но...

Безопасное извлечение устройства
Привет=) Я вставляю флешку и нажимаю "Безопасное извлечение устройства" - и она долго долго стоит и только потом появляется...как...

Безопасное извлечение устройства
Есть ли готовая функция или готовый способ, который поможет решить мою проблему?

15
Эксперт .NET
 Аватар для Rius
13007 / 7606 / 1663
Регистрация: 25.05.2015
Сообщений: 23,143
Записей в блоге: 14
17.05.2023, 09:28
Посмотрите How to Prepare a USB Drive for Safe Removal.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.05.2023, 09:48  [ТС]
Я пока не нашёл документации относительно того чтобы буква диска сохранялась, при использовании функции безопасного извлечения устройства.
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
17.05.2023, 13:32
Цитата Сообщение от HackerVlad Посмотреть сообщение
Кстати я даже не знаю Shell.Application это вообще WMI или нет...
Это проводник/оболочка Windows, в некоторых случаях он выдает себя еще за Internet Explorer. Вообще в XP-шке проводник вроде как тесно интгрирован с IE, там если в проводнике в адресную строку ввести интернет адрес, то он как бы раз и превращается в IE, я именно так это помню, что именно как буд-то превращается "на лету".

Добавлено через 46 минут
Или наоборот, как бы IE-шный объект выдает себя за "Проводник". У этого (Shell.Application) есть одна фишка, можно сказать "пасхалка". Здесь писал про нее, а изначально узнал про это на "Сером форуме" в теме про обмен данными между скриптами.
1
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
17.05.2023, 13:47
Скриншёт прилагаю. Можеть и в новом проводнике можно этот "Eject" нарыть, а так не спорю конечно api-шные методы всегда лучше.
Миниатюры
Безопасное извлечение устройства, не удаляя букву диска  
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
17.05.2023, 13:57
Папка с Process Explorer попала в обзор совершенно слчайно, чтоб не подумал, что я фанат Руссиновича и в каждой теме его рекламирую))
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.05.2023, 14:01  [ТС]
testuser2, кстати поставь себе программу Process Hacker как у меня, и сравни, надеюсь Process Hacker тебе больше понравится)
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
17.05.2023, 15:49
Цитата Сообщение от HackerVlad Посмотреть сообщение
Process Hacker
. Я знаю эту прогу, и раньше ей часто пользовался, как раз в то время, когда активно пользвался флешками и внешними хардами. Допустим какой-нить процесс прицепился к флешке, мочишь его диспетчером, Руссиновичем, тасккилом - не поддается, тут уж приходильось включать PH и его непревзойденный процесс-тепминатор. Бывало, конечно, что и терминатор не помагал, но очень редко )
На XP и 7ке извлечение глючное было. Для извлечения флешек и прочего мне нраились утилиты Nirsoft USBDeview и Devmanview (аналог диспетчера устройств). Сейчас зашел на сайт, оказыается автор (Nir Sofer) пишет на VB (также на C++, .NET), там в разделе "Code Samples" есть примеры кодов на VB.

Добавлено через 34 минуты
На Руборде вообще пишут, что Microsoft купил PH, может быть они объединят PH с PE в одну прогу или как это будет х.з.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.05.2023, 16:41  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Для извлечения флешек и прочего мне нраились утилиты Nirsoft USBDeview
Лично я написал сам для себя безопасное извлечение по горячим клавишам флешки. Очень удобно.

Добавлено через 10 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
На XP и 7ке извлечение глючное было
Лично у меня ничего никогда не глючит, ни на XP, ни на семёрке. Единственное, что только я не люблю пользоваться стандартным безопасным извлечением устройств из трея винды это очень не удобно. Там ещё замучаешься выбирать нужный диск. Я написал конечно для себя свою программу для этой цели которая автоматически определит букву диска флешки и безопасно её извлекёт. Единственная проблема, если это вдруг будет кардридер, то я не хотел бы чтобы удаляло букву диска!!! Как сделать чтобы не удаляло букву диска, я пока не знаю, поэтому и завёл эту тему.
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
17.05.2023, 16:53
Цитата Сообщение от HackerVlad Посмотреть сообщение
Единственная проблема, если это вдруг будет кардридер, то я не хотел бы чтобы удаляло букву диска!!!
Я бы копал в сторону "сохранять букву диска с привязкой к устройству и метке раздела" и восстановление буквы в случае неподходящего присвоения."
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.05.2023, 00:08  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Я бы копал в сторону
Я искал ответ в описании функции CM_Request_Device_EjectA но пока не нашёл такого параметра там.
Я умею определять диски, тип устройства, их физические имена, я умею с помощью setuapi.dll кое что. Но тут мне нужна просто подсказка.
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
18.05.2023, 03:36
Исканул по теме, есть такая прога USBDLM, реализована как сервис. Автор немец, а бюргеры они такие ребята, дотошные, по иному врядли стоит пытаться делать, только что-то вроде сервиза..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.05.2023, 13:10  [ТС]
Ну это не совсем то, что мне надо. Мне нужна не программа, а правильный код. Тем более эта программа занимается ни тем что мне надо...

Добавлено через 2 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
Исканул по теме
Ну тема у меня другая конечно, но что касательно изменения букв для флешек то я и сам могу это делать в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices

Добавлено через 7 минут
Цитата Сообщение от Rius Посмотреть сообщение
Посмотрите How to Prepare a USB Drive for Safe Removal.
Вот мне дали например ссылку, это хорошая подсказка, но этот код я уже давным давно переписал с C++ на VB6 ещё пару лет назад. Фишка вся в том, что именно этот код и не может безопасно извлечь, не удаляя букву диска. А я ставлю сейчас именно такую задачу.

Добавлено через 11 минут
Я уже устал читать MSDN если честно, так и не нашёл ответов... Неужели никто не знает??? На форуме же куча людей!? (или нет, на форуме жуть как мало людей)

Добавлено через 3 минуты
Возможно мне надо использовать совсем другую функцию, а не CM_Request_Device_EjectA

Добавлено через 19 минут
Если бы я мог посмотреть код функции Извлечь в проводнике

Добавлено через 1 минуту
Возможно, надо использовать IOCTL_STORAGE_EJECT_MEDIA

Добавлено через 9 минут
Ну конечно! Я смотрел совсем ни в ту сторону! Надо использовать другую функцию! Функцию, которая извлекает CD/DVD она ещё способна так же и извлекать флешки, не удаляя букву диска. Функция DeviceIoControl с параметром IOCTL_STORAGE_EJECT_MEDIA. Ну никто не мог подсказать, пока я сам не догадался...
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.05.2023, 14:16  [ТС]
Лучший ответ Сообщение было отмечено The trick как решение

Решение

А вот и решение:

Visual Basic
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
Option Explicit
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As OVERLAPPED) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
Private Const INVALID_HANDLE_VALUE As Long = -1
Private Const OPEN_EXISTING As Long = 3
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const IOCTL_STORAGE_EJECT_MEDIA = &H2D4808
Private Const IOCTL_STORAGE_LOAD_MEDIA = &H2D480C
 
Private Type OVERLAPPED
    Internal As Long
    InternalHigh As Long
    offset As Long
    OffsetHigh As Long
    hEvent As Long
End Type
 
' Извлечение диска (USB или CD/DVD), при этом буква диска остаётся (для всех версий Windows)
Public Sub EjectDrive(DriveLetter As String)
    Dim hDrive As Long
    Dim DummyReturnedBytes As Long
    Dim ol As OVERLAPPED
    
    hDrive = CreateFile("\\.\" & DriveLetter & ":", GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, 0, 0)
    
    If hDrive <> INVALID_HANDLE_VALUE Then
        Call DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, DummyReturnedBytes, ol)
        Call CloseHandle(hDrive)
    End If
End Sub
 
' Загрузка диска (USB или CD/DVD)
Public Sub LoadDrive(DriveLetter As String)
    Dim hDrive As Long
    Dim DummyReturnedBytes As Long
    Dim ol As OVERLAPPED
    
    hDrive = CreateFile("\\.\" & DriveLetter & ":", GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, OPEN_EXISTING, 0, 0)
    
    If hDrive <> INVALID_HANDLE_VALUE Then
        Call DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, 0, 0, 0, 0, DummyReturnedBytes, ol)
        Call CloseHandle(hDrive)
    End If
End Sub
 
Private Sub Command1_Click()
    EjectDrive Mid$(Drive1.Drive, 1, 1) ' Только буква
End Sub
 
Private Sub Command2_Click()
    LoadDrive Mid$(Drive1.Drive, 1, 1) ' Только буква
End Sub
Данный код, кстати, так же отвечает на вопрос как извлечь лоток CD/DVD второго физического CD-ROM чисто по букве диска, задавая. В отличии от кода
Visual Basic
1
Call mciSendString("Set CDAudio Door Open Wait", 0&, 0&, 0&)
который открывает только первый физический CD-ROM или DVD-ROM, а то я помню у меня было раньше два DVD-привода и я долго голову ломал и не знал как открыть второй DVD-привод, потому что не знал другого кода...
Вложения
Тип файла: zip Извлечение диска.zip (5.8 Кб, 9 просмотров)
3
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
18.05.2023, 17:05
Нир Софер извлекает лоток по тому же сценарию. Последний параметр в функции DeviceIoControl видимо можно задавать пустым. Монитор комманды E:\Программы\nircmd-x64\nircmd.exe cdrom open G:
Миниатюры
Безопасное извлечение устройства, не удаляя букву диска  
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
18.05.2023, 19:07  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Нир Софер извлекает лоток по тому же сценарию
Так чего ты сразу мне не сказал)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2023, 19:07
Помогаю со студенческими работами здесь

Безопасное извлечение устройства - не видно
Может кто сталкивался. При подключении флешек или жестких дисков в системном трее () нет значка безопасного извлечения устройств. ...

Безопасное извлечение устройства для внешнего HDD
Итак, подарили такое чудо: HDD Transcend StoreJet 25M3 500 Gb. Собственно до этого с внешними HDD практически не имел дело, так как просто...

Безопасное извлечение диска
Как реализовать безопасное извлечение флеш диска по нажатию на кнопки, и диалоговым окном о том что можно отключать флешку с usb порта? В...

Безопасное извлечение дисков негативно повлияло на другие съемные устройства
Добрый день. Вот возникла такая проблема, ни когда не использовал &quot;безопасное извлечение устройства и дисков&quot;, но вот мне...

Как убрать Видеокарту из раздела "Безопасное извлечение устройства"
После обновления драйверов на видеокарте, она постоянно висит в разделе &quot;безопасное извлечение&quot;. В гугле нашёл только информацию про...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru