Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Блокировка и разблокировка CD-ROM

Delphi , Файловая система , CD-ROM



Автор: Baa
WEB-сайт: http://forum.vingrad.ru

Вы уж простите, что на сях... сподручней было :\

//заблокировать 
void CMFcDlg::OnBnClickedButton1() 
{ 
HANDLE hDevice = CreateFile ("\\\\.\\E:",  
 GENERIC_READ, 
 FILE_SHARE_READ | FILE_SHARE_WRITE, 
 NULL, 
 OPEN_EXISTING, 
 NULL, 
 NULL); 
DWORD dwBytesReturned = 0; 
PREVENT_MEDIA_REMOVAL pmr = {TRUE}; 
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr),
  NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be locked");
CloseHandle (hDevice); 
} 

//разблокировать
void CMFcDlg::OnBnClickedButton2() 
{ 
HANDLE hDevice = CreateFile ("\\\\.\\E:",  
 GENERIC_READ, 
 FILE_SHARE_READ | FILE_SHARE_WRITE, 
 NULL, 
 OPEN_EXISTING, 
 NULL, 
 NULL); 
DWORD dwBytesReturned = 0; 
PREVENT_MEDIA_REMOVAL pmr = {FALSE}; 
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr),
  NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be unlocked");
CloseHandle (hDevice); 
} 

Вот перевод текста на русский язык:

Это фрагмент кода на 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.

Вот пример, как можно модифицировать код для использования этого альтернативного решения:

void CMFcDlg::OnBnClickedButton1() 
{ 
    HANDLE hDevice = CreateFile("\\\\.\\E:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); 
    DWORD dwBytesReturned = 0; 
    if (!DeviceIoControl(hDevice, IOCTL_STORAGE_EJECT_MEDIUM, &Eject, sizeof(Eject), NULL, 0, &dwBytesReturned, NULL)) { 
        AfxMessageBox("Door can't be locked"); 
    } 
    CloseHandle(hDevice); 
} 

void CMFcDlg::OnBnClickedButton2() 
{ 
    HANDLE hDevice = CreateFile("\\\\.\\E:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); 
    DWORD dwBytesReturned = 0; 
    if (!DeviceIoControl(hDevice, IOCTL_STORAGE_EJECT_MEDIUM, &Eject, sizeof(Eject), NULL, 0, &dwBytesReturned, NULL)) { 
        AfxMessageBox("Door can't be unlocked"); 
    } 
    CloseHandle(hDevice); 
} 

struct Eject { 
    BOOLEAN bEject; 
}; 

Обратите внимание, что это альтернативное решение требует определения команды IOCTL IOCTL_STORAGE_EJECT_MEDIUM и структуры Eject.

В статье описаны методы блокировки и разблокировки CD-ROM, которые реализованы с помощью вызова функции DeviceIoControl и создания handle на устройство CD-ROM.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: CD-ROM ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 13:39:28/0.0032830238342285/0