Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2007, 23:28   #1
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
Лампочка Как заблокировать сменные устройства хранения данных?

Доброго времени суток.
Требуется заблокировать лоток CD-ROMa (к примеру).
предпологаемай код:

Код:
procedure CD_Lock(Locked: Boolean; DriveLetter: string);
const
 IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var
 hDrive: THandle;
 Returned: DWORD;
 DisableEject: boolean;
begin

hDrive:=CreateFile(PChar(DriveLetter), GENERIC_READ,FILE_SHARE_READ {0}, nil,
OPEN_EXISTING {OPEN_ALWAYS}, FILE_ATTRIBUTE_NORMAL {0},0);

 if GetLastError <> 0 then
   MessageDlg('Error: ' + IntToStr(GetLastError), mtError, [mbOK], 0);

 try
   DisableEject := Locked;
   if not DeviceIoControl(hDrive,
     IOCTL_STORAGE_MEDIA_REMOVAL, // PREVENT_MEDIA_REMOVAL,
     @DisableEject,
     SizeOf(DisableEject), nil, 0, Returned, nil) then
     MessageDlg('Ошибка: ' + IntToStr(GetLastError), mtError, [mbOK], 0)
     // процедура выдаёт ошибку
 finally
   CloseHandle(hDrive)
 end;
end;
Но однако здесь есть какой-то недостаток, помогите пожалуйста.
Всё гениальное - просто!

Последний раз редактировалось rpy3uH; 25.07.2008 в 15:12.
Air вне форума Ответить с цитированием
Старый 30.11.2007, 00:02   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Телепаты в отпуске, а на "Поле чудес" это непохоже....

И как ты определил что в коде есть недостаток? Чтоб найти его надо или вникать в каждое слово или запускать делфи.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 30.11.2007, 16:50   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Это очень просто - лоток не блокируется.
А если есть возможность не запуская Delphi, оставить свой вариант, - милости просим

Спасибо.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 30.11.2007, 17:33   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Код:
procedure TForm32.CD_Lock(Locked: Boolean; DriveLetter: string);
const
IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var
hDrive: THandle;
Returned: DWORD;
DisableEject: boolean;
begin
hDrive := CreateFile(PChar('\\.\' + DriveLetter), GENERIC_READ,
  FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 
  0);
if GetLastError <> 0 then 
  MessageDlg('Error:' + IntToStr(GetLastError), mtError, [mbOK], 0); 
try
  DisableEject := Locked;
  if not DeviceIoControl(hDrive,
    IOCTL_STORAGE_MEDIA_REMOVAL, // PREVENT_MEDIA_REMOVAL,
    @DisableEject,
    SizeOf(DisableEject),
    nil,
    0,
    Returned,
    nil) then
    MessageDlg('Ошибка:' + IntToStr(GetLastError), mtError, [mbOK], 0)
finally
  CloseHandle(hDrive)
end;
end;
Проверил, работает.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 30.11.2007, 18:23   #5
GAGARIN-NEW
Познаю мир
Форумчанин Подтвердите свой е-майл
 
Аватар для GAGARIN-NEW
 
Регистрация: 05.10.2007
Сообщений: 387
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
Код:
procedure TForm32.CD_Lock(Locked: Boolean; DriveLetter: string);
const
IOCTL_STORAGE_MEDIA_REMOVAL = $002D4804;
var
hDrive: THandle;
Returned: DWORD;
DisableEject: boolean;
begin
hDrive := CreateFile(PChar('\\.\' + DriveLetter), GENERIC_READ,
  FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 
  0);
if GetLastError <> 0 then 
  MessageDlg('Error:' + IntToStr(GetLastError), mtError, [mbOK], 0); 
try
  DisableEject := Locked;
  if not DeviceIoControl(hDrive,
    IOCTL_STORAGE_MEDIA_REMOVAL, // PREVENT_MEDIA_REMOVAL,
    @DisableEject,
    SizeOf(DisableEject),
    nil,
    0,
    Returned,
    nil) then
    MessageDlg('Ошибка:' + IntToStr(GetLastError), mtError, [mbOK], 0)
finally
  CloseHandle(hDrive)
end;
end;
Проверил, работает.
У меня не работает ((( Выдаётся ошибка 6 . наверно мой dvd глючит .. он у меня малец лажовый... или не иззанего ?
---
GAGARIN-NEW вне форума Ответить с цитированием
Старый 30.11.2007, 18:47   #6
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Нашёл рабочий пример здесь.. http://decoding.narod.ru/faq/hard/di.../cdrom001.html

Тепер мой СДРОМ вообще неоткрывается.. наверное ребут надо....

АДД: разобрался.... вернул всё в зад... )
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...

Последний раз редактировалось Карась; 30.11.2007 в 18:49.
Карась вне форума Ответить с цитированием
Старый 30.11.2007, 19:20   #7
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Интересно, а это там зачем "PREVENT_MEDIA_REMOVAL," , ну да ладно, Благодарю всех!
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 01.12.2007, 12:30   #8
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

А хоть немного подумать ?
Что в Windows есть "буква диска" ?
Неужели думаете что "C","D" и так далее ?
Таки спешу вас разочаровать.. буква диска в Windows это "C:","D:"....
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 01.12.2007, 20:08   #9
GAGARIN-NEW
Познаю мир
Форумчанин Подтвердите свой е-майл
 
Аватар для GAGARIN-NEW
 
Регистрация: 05.10.2007
Сообщений: 387
По умолчанию

Я так и писал.... непроехало....
---
GAGARIN-NEW вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как програмно заблокировать файл SeRhy Общие вопросы Delphi 1 01.08.2008 11:21
как заблокировать ввод букв в StringGrid? LeoN Общие вопросы Delphi 1 05.10.2007 08:09
как узнать с какого устройства идет ввод данных keg Win Api 5 20.07.2007 10:50
Заблокировать запись Yoger БД в Delphi 4 15.02.2007 14:19