Это фрагмент кода на C++, демонстрирующий, как зафиксировать и раззафиксировать привод CD-ROM с помощью Windows API. Код использует функцию CreateFile для открытия устройства CD-ROM, а затем функцию DeviceIoControl для отправки команды IOCTL (управления вводом-выводом) для фиксации или разфiksации носителя.
Зафиксировка CD-ROM
Функция OnBnClickedButton1 вызывается при клике кнопки "Lock". Она открывает устройство CD-ROM с помощью CreateFile, а затем отправляет команду IOCTL с кодом IOCTL_STORAGE_MEDIA_REMOVAL для фиксации носителя. Структура PREVENT_MEDIA_REMOVAL передается в параметре, установленная в TRUE, чтобы указать, что носитель должен быть зафиксирован.
Если операция неудачна, отображается сообщение об ошибке с текстом "Дверь не может быть зафиксирована".
Раззафиксировка CD-ROM
Функция OnBnClickedButton2 вызывается при клике кнопки "Unlock". Она открывает устройство CD-ROM с помощью CreateFile, а затем отправляет команду IOCTL с кодом IOCTL_STORAGE_MEDIA_REMOVAL для разфiksации носителя. Структура PREVENT_MEDIA_REMOVAL передается в параметре, установленная в FALSE, чтобы указать, что носитель должен быть раззафиксирован.
Если операция неудачна, отображается сообщение об ошибке с текстом "Дверь не может быть раззафиксирована".
Примечания к коду
Код использует функцию CreateFile для открытия устройства CD-ROM. Эта функция возвращает.handle на устройство, который используется в последующих операциях.
Функция DeviceIoControl используется для отправки команды IOCTL на устройство. В этом случае она используется для фиксации или разфiksации носителя.
Структура PREVENT_MEDIA_REMOVAL используется для передачи параметров команде IOCTL. В этом случае она устанавливается в TRUE, чтобы зафиксировать носитель, или в FALSE, чтобы раззафиксировать его.
Код использует обработку ошибок для ловли любых неудачных операций.
Альтернативное решение
Вместо использования команды IOCTL IOCTL_STORAGE_MEDIA_REMOVAL можно использовать команду IOCTL IOCTL_STORAGE_EJECT_MEDIUM для физического извлечения носителя из привода. Для фиксации носителя нужно установить параметр Eject в FALSE, а для разфiksации - в TRUE.
Вот пример, как можно модифицировать код для использования этого альтернативного решения:
voidCMFcDlg::OnBnClickedButton1(){HANDLEhDevice=CreateFile("\\\\.\\E:",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);DWORDdwBytesReturned=0;if(!DeviceIoControl(hDevice,IOCTL_STORAGE_EJECT_MEDIUM,&Eject,sizeof(Eject),NULL,0,&dwBytesReturned,NULL)){AfxMessageBox("Door can't be locked");}CloseHandle(hDevice);}voidCMFcDlg::OnBnClickedButton2(){HANDLEhDevice=CreateFile("\\\\.\\E:",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);DWORDdwBytesReturned=0;if(!DeviceIoControl(hDevice,IOCTL_STORAGE_EJECT_MEDIUM,&Eject,sizeof(Eject),NULL,0,&dwBytesReturned,NULL)){AfxMessageBox("Door can't be unlocked");}CloseHandle(hDevice);}structEject{BOOLEANbEject;};
Обратите внимание, что это альтернативное решение требует определения команды IOCTL IOCTL_STORAGE_EJECT_MEDIUM и структуры Eject.
В статье описаны методы блокировки и разблокировки CD-ROM, которые реализованы с помощью вызова функции DeviceIoControl и создания handle на устройство CD-ROM.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.