Пятница, 04.07.2025, 15:41
Приветствую Вас Гость | RSSГлавная | Регистрация | Вход
Меню сайта
Категории раздела
Субклассирование элементов управления [3]
Приёмы субклассирования различных элементов управления для расширения их функциональных возможностей.
Вспомогательные функции [4]
Полезные советы, которые могут пригодиться во всех областях программирования
Мультимедиа [2]
Советы по работе над различными мультимедийными приложениями.
Необычные приложения [1]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Программирование на Visual Basic » Мультимедиа

Разблокирование дисковода CD-ROM

Программы, используемые для записи компакт-дисков, такие как Nero Burning Rom, и другие, обычно блокируют дисковод CD-ROM во время записи (и совершенно правильно делают). Бывают ситуации, когда программа в процессе прожига зависает, например, если попадётся некачественная болванка. В этом случае приложение приходится закрывать принудительно с помощью диспетчера задач. Дисковод при этом остаётся заблокированным, и извлечь болванку невозможно до перезагрузки компьютера. Разблокировать дисковод, не перезагружаясь, нам поможет функция DeviceIoControl, описанная в предыдущей статье.

Не будем повторяться в объявлениях. Нам нужно будет только объявить дополнительно одну константу, и одну структуру, состоящую только из одного члена (зачем такие сложности - непонятно).

Const IOCTL_STORAGE_MEDIA_REMOVAL = &H2D4804

Type PREVENT_MEDIA_REMOVAL
 PreventMediaRemoval As Long
End Type 'PREVENT_MEDIA_REMOVAL

Функция разблокирования дисковода немного отличается от функции EjectCD:

Public Function AllowCDOpening(ByVal drivePath As String) As Boolean
 Dim drFullPath As String
 Dim hDevice As Long, nBytesReturned As Long
 Dim pmr As PREVENT_MEDIA_REMOVAL
 
 drivePath = Replace(drivePath, "\", "")
 drFullPath = "\\.\" & LCase(drivePath)
 
 'Чтобы разрешить открытие дисковода,
 'нужно присвоить значение 0
 pmr.PreventMediaRemoval = 0&
 
 hDevice = CreateFile( _
 drFullPath, _
 GENERIC_READ, _
 FILE_SHARE_READ Or FILE_SHARE_WRITE, _
 ByVal 0&, OPEN_EXISTING, 0, 0)
 
 If hDevice <> INVALID_HANDLE_VALUE Then
 AllowCDOpening = CBool( _
 DeviceIoControl(hDevice, _
 IOCTL_STORAGE_MEDIA_REMOVAL, _
 ByVal VarPtr(pmr), LenB(pmr), 0, 0, _
 nBytesReturned, ByVal 0&))
 CloseHandle hDevice
 End If
End Function 'AllowCDOpening

Если вы захотите заблокировать дисковод, функция PreventCDOpening будет отличаться от вышеописанной только одной строчкой:

pmr.PreventMediaRemoval = 1&

Будьте осторожны с функцией DeviceIoControl !. С её помощью можно ещё и форматировать диски. Ошибка в константе - и большой привет!

Автор - Цзяофань

Категория: Мультимедиа | Добавил: Xiaofang (12.06.2009)
Просмотров: 3536 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Форма входа
Поиск
Друзья сайта
Антология советской песни
Сайт управляется системой uCoz