Программы, используемые для записи компакт-дисков, такие как Nero Burning Rom, и другие, обычно блокируют дисковод CD-ROM во время записи (и совершенно правильно делают). Бывают ситуации, когда программа в процессе прожига зависает, например, если попадётся некачественная болванка. В этом случае приложение приходится закрывать принудительно с помощью диспетчера задач. Дисковод при этом остаётся заблокированным, и извлечь болванку невозможно до перезагрузки компьютера. Разблокировать дисковод, не перезагружаясь, нам поможет функция DeviceIoControl, описанная в предыдущей статье.
Не будем повторяться в объявлениях. Нам нужно будет только объявить дополнительно одну константу, и одну структуру, состоящую только из одного члена (зачем такие сложности - непонятно).
Const IOCTL_STORAGE_MEDIA_REMOVAL = &H2D4804
Type PREVENT_MEDIA_REMOVAL
PreventMediaRemoval As Long
End Type
Функция разблокирования дисковода немного отличается от функции 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)
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
Если вы захотите заблокировать дисковод, функция PreventCDOpening будет отличаться от вышеописанной только одной строчкой:
pmr.PreventMediaRemoval = 1&
Будьте осторожны с функцией DeviceIoControl !. С её помощью можно ещё и форматировать диски. Ошибка в константе - и большой привет!
Автор - Цзяофань
|