Форум: "Система";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
ВнизКак узнать состояние лотка CD-ROM? Найти похожие ветки
← →
BPK (2003-02-17 23:00) [0]Открыть и закрыть дверцу CD-ROM это хорошо. Таких советов навалом в Сети (причём подавляющее большинство - с использованием MCI, а не WinAPI).
Только вот никто не может сказать, как узнать, открыта ли в данный момент эта дверца.
← →
Zhenka (2003-02-18 09:32) [1]Пользуйтесь API - функцией
TrayDeviceInfo(driveLetter: char; info: word): word;
в качестве параметров передавайте
driveLetter - буква диска,
info - TRAY_DEVICE_INFO_GET_TRAY_OPEN_STATUS.
Возвращаемые значения: 0 - закрыт, 1 - открыт, 2 - лоток
заело, 3 - лоток сломан.
===========================
А как узнать есть лоток или нет?
Ответ: Та же функция TrayDeviceInfo() (см. выше) возвратит
код ошибки
ERROR_TRAY_DEVICE_NO_TRAY при попытке применения к
устройству CD-ROM и др. без лотка.
← →
Zhenka (2003-02-18 09:45) [2]ещё вот
======
А как определить есть ли на выдвинутом лотке диск или лоток
пустой?
Ответ:
Довольно сложная операция. На помощь придет функция
CoffeeCupHolderInfo(driveLetter: char; info: word): word; Ее параметры
аналогичны параметрам TrayDeviceInfo(). Передав в качестве info
значение COFFEE_CUP_HOLDER_GET_CUP_MASS, вы получите в результате массу положенного на лоток груза.
Если на лотке лежит диск то вы получите значение больше 0.
Этот метод обнаружит не только диск но и любую другую нагрузку на лоток.
Если же необходимо точно утверждать что лежит именно диск, пользуйтесь info COFFEE_CUP_HOLDER_GET_CUP_GEOMETRY. В качестве результата будет получен уникальный идентификатор формы объекта, лежащего на лотке. Для стандартных CD-дисков он обычно равен 876 - 891.
Однако если на лотке лежит не стандартный диск (погнутый или немного поцарапанный) то вы получите совершенно другой результат функции и поэтому этот метод тоже на 100% не гарантирует точность распознавания диска на лотке.
← →
AGGRESSOR (2003-02-18 13:18) [3]
> Zhenka ©
Ну вы, блин, даете! :)
Кстати, не забудь написать, что для того, чтобы воспользоваться этими замечательными функциями, нужно установить сервис-пак для ОС, доступный по адресу www.microsoft.com/support/dummy.html
(для русскоязычной винды www.microsoft.ru/files/chainik.asp) или использовать Delphi 8, в которой по умолчанию включена поддержка этих функций.
← →
Беспечный Ангел (2003-02-18 15:08) [4]
> или использовать Delphi 8, в которой по умолчанию включена
> поддержка этих функций
Но ведь в ранних версиях делфи можно дать комманду DELPHI_8.FUNCTION:=ENABLE; и не надо никаких сервис-паков!!! Вот тока в 9 делфи это почему-то не работает... ;)
Мне вот еще интересно, какое значение вернет функция COFFEE_CUP_HOLDER_GET_CUP_GEOMETRY для пепельницы, чашки с/без кофе и для пожеванных дисков... ;)
← →
AGGRESSOR (2003-02-18 16:38) [5]
> DELPHI_8.FUNCTION:=ENABLE
:)))
А что до пепельницы- официально пепельница не заявлена в списке поддерживаемых plug-n-play девайсов, но есть недокументированный булевский параметр IsAshTray, возвращает true в случае пепельницы. А вот на счет пожеваных дисков- это вопрос к мастерам, а я любитель :)
← →
Беспечный Ангел (2003-02-18 17:27) [6]
> официально пепельница не заявлена в списке поддерживаемых
> plug-n-play девайсов
Надо бы биос обновить... Потом напишу, что из этого получилось...
А функцию атоматической очистки пепельницы не подскажете??? ;)
← →
BPK (2003-02-18 23:03) [7]Уважаемый Zhenka и прочие хохмачи, я шуток не понимаю. Мне нужен серьёзный ответ.
WinAPI-функция TrayDeviceInfo не существует, а CoffeeCupHolderInfo и всё остальное просто издевательство над серьёзными людьми.
Пожалуйста, не мусорьте ложными ответами, а приведите РЕАЛЬНОЕ решение, если Вы, конечно, его знаете.
← →
Zhenka (2003-02-19 05:19) [8]Тов. Bpk ИМХО такое сделать нельзя, Можно лиш проверить Состояние готовности сиди, если сиди не готоов , то может дажеи дверца открыта, а может диска нет??
← →
BPK (2003-02-19 15:59) [9]IMHO такое сделать можно, потому что у любого привода CD-ROM в слове состояния есть флаг состояния лотка. Как читать этот флаг из-под MS-DOS я знаю, но нужно решение для Win32 API.
Я не верю, что в Microsoft об этом не позаботились.
← →
DVM (2003-02-19 16:04) [10]1. Не у любого привода есть лоток
2. У некоторых приводов несколько лотков.
← →
AGGRESSOR (2003-02-19 16:12) [11]
> DVM © (19.02.03 16:04)
3. Не все то лоток, что выезжает из привода...
← →
Anatoly Podgoretsky (2003-02-19 16:44) [12]BPK (19.02.03 15:59)
Не у любого, и не обязательно что оно меняется
← →
DVM (2003-02-19 18:24) [13]
> AGGRESSOR
> 3. Не все то лоток, что выезжает из привода...
Есть стойки из десятков дисков, в системе видятся как один диск, на стойке кнопка - выбор диска. Ничто там никуда не вьезжает и не выезжает и я просто не представляю себе универсальную функцию способную определить состояние такого девайса.
p.s. А в системе этот девайс выглядит как обычный сд-привод и даже по-минимому драйверов не требует.
← →
Ich Hasse (2003-02-19 22:41) [14]Народ, если честно я балдею... откуда взялся Delphi 8, а тем более 9. Насколько я знаю Borland выпустил только Delphi 7.
А вопрос как узнать положили ли диск в лоток вообще классный
А где клавиатура лежит (под столом или над столом) может тоже сказать?
← →
Anatoly Podgoretsky (2003-02-19 22:49) [15]Ich Hasse © (19.02.03 22:41)
Ни кто не спрашивал про диск, вопрос был про лоток
← →
BPK (2003-02-20 03:14) [16]Если бы некоторые умники нормально разбирались бы в аппаратуре и хотя бы раз разбирали привод CD-ROM, они бы знали, что внутри есть пара контактов, которая замыкается (или размыкается, в каждой модели по-разному) при выдвинутом лотке.
Эти контакты служат для отключения двигателя выдвигания лотка, а одновременно используются для программного определения состояния лотка.
Там, где нет лотка, там флаг состояния тоже присутствует, просто механика другая.
Короче, нефиг сорить в форуме. Уже с десяток ответов, а дельного совета нет. Не смущайте других людей, которые бродят здесь в поисках ответов.
← →
Alex Konshin (2003-02-20 03:48) [17]Если ты точно знаешь, какой регистр IDE и какой бит нужно читать из-под DOS, то их можно попробовать достать и из-под NT. Например, через DeviceIoControl c IOCTL_SCSI_MINIPORT (не обращай внимания на то, что там слово SCSI присутствует).
Короче, не обещаю, что сработает, но попробовать можно.
Возможно, что и через SMART можно достать. Короче повнимательнее нужно посмотреть документацию.
Напиши на e-mail о том, что ты читаешь под DOS, я попробую помочь тем, что знаю. Можешь сослаться на документ на t13 - я найду.
← →
Serja (2003-02-20 09:15) [18]> Беспечный Ангел
> Но ведь в ранних версиях делфи можно дать комманду DELPHI_8.FUNCTION:=ENABLE;
> и не надо никаких сервис-паков!!! Вот тока в 9 делфи это
> почему-то не работает... ;)
В Делфи 9 надо писать уже
DELPHI_8.FUNCTION.ENABLE:=TRUE;
← →
Беспечный Ангел (2003-02-20 09:57) [19]
> Если бы некоторые умники нормально разбирались бы в аппаратуре
> и хотя бы раз разбирали привод CD-ROM....
Некоторые "умники" как раз в железе хорошо и разбираются... Так вот, дело в том, что далеко не все CD приводы выдадут на гора тебе эту информацию. Скажем с Mitsumi ты этого не вытянешь (по крайней мере, я его очень долго и нудно "ковырял"). А тебе, как я понимаю, нужно универсальное средство... Проще, когда тебе нужно ТОЧНО знать, в каком состоянии каретка, посылать ей комманду... А насчет того, что
> Эти контакты служат для отключения двигателя выдвигания
> лотка, а одновременно используются для программного определения
> состояния лотка.
то посмотри на CD Samsung: вроде все ок, а ты попробуй скорость ограничить! Не выйдет... Вот так и с этим. Чаще всего, ИМХО, эти контакты используются ТОЛЬКО для двигателя лотка. Вот... Нужна будет дополнительная инфа, пиши....
← →
Беспечный Ангел (2003-02-20 10:06) [20]
> Serja
Да, работает! ;) А вообще, наверное, хорош хохмить... Человек правда помощи попросил... Жаль, конечно, по поводу обновления биоса классная шутка есть, но.... Мусорить не буду...
← →
BPK (2003-02-20 11:42) [21]Из-под MS-DOS не нужно посылать команду непосредственно в порт ATA-контроллера, достаточно послать через MSCDEX команду непосредственно драйверу CD-ROM.
У DOS-драйвера CD-ROM есть команда IOCTL Input (код команды: 3). У этой команды есть подфункция номер 6: определение состояния устройства, которая возвращает слово состояния привода.
В этом слове нулевой бит как раз показывает состояние лотка:
1 - устройство открыто
0 - устройство закрыто
Кому интересны подробности, см. книгу Александра и Григория Фроловых "Библиотека системного программиста", том 33, стр.189.
Данным флагом состояния лотка пользуется, например, DOS Navigator в своём CD-проигрывателе: нажали кнопку - лоток выехал, ещё раз нажали ту же кнопку - закрылся.
То, что под Windows флаг состояния лотка доступен можно доказать с помощью программы EAC (Exact Audio Copy), в которой кнопка открывания-закрывания лотка действует похожим образом.
Так что, изучайте вопрос прежде чем хохмить. Этим вы лишь показываете своё невежество и склонность делать поспешные выводы, да ещё смущаете людей, соблазнившихся большим количеством ответов на вопрос. То-то они удивятся прочитав всю эту ахинею!
← →
BPK (2003-02-23 23:44) [22]Эй, специалисты! Куда вы пропали? Жду ответа.
← →
AGGRESSOR (2003-02-25 17:46) [23]Возьмем примитивный лазерный проигрыватель Microsoft.
Если диск находится в устройстве, он успешно его открывает/закрывает одной кнопкой. Но если лоток пустой, то происходит только close, а eject- ни-ни.
Вывод: прога пробует читать диск, и если это успешно, делает eject. И если даже дядя Билли не встроил в свой супер-пупер проигрыватель простую функцию проверки состояния лотка- значит, для виндюха она недоступна по некоторым соображениям (например, в целях безопасности (на случай войны с Ираком :)).
← →
BPK (2003-02-26 11:34) [24]Я, кажется, ясно написал: EAC (Exact Audio Copy), а не какой-то лазерный проигрыватель. Когда вы все научитесь внимательно читать?!
← →
AGGRESSOR (2003-02-26 16:06) [25]
> BPK
Вот решение EAC"a: попробуй вручную выдвинуть лоток, а потом задвинуть программно, и наоборот, пока по нажатии на кнопку ничего не произойдет, а при повторном уже будет нужное действие.
В ЕАС есть флаг, который изначально установлен, допустим, на "закрытый лоток", потом при нажатии на кнопку флаг меняется. Если же открыть лоток руками, а потом нажать на кнопку, то флаг, будучи в положении "закрытый лоток", даст команду на открытие, и ничего не произойдет.
← →
GiGi (2003-02-26 23:39) [26]Серьезно... сли мне память не изменяет (с процессором) - то даже Винда сама такое сделать не может...А куда уж тогда всяким прогам, работающим под нее...
← →
Лёшик (2003-02-28 11:33) [27]Если под досовским очком можешь определить задвинут ли привод или нет то почему бы те не запустить это очко через CreateProcess а потом просто не обработать эту инфу ...
← →
BPK (2003-03-02 14:16) [28]>AGGRESSOR
>Вот решение EAC"a: попробуй вручную выдвинуть лоток, а потом
>задвинуть программно, и наоборот, пока по нажатии на кнопку
>ничего не произойдет, а при повторном уже будет нужное действие.
Ничего подобного. EAC отрабатывает ситуацию сразу, т.е. это не какой-то внутренний флаг EAC.
>Лёшик
>Если под досовским очком можешь определить задвинут ли привод
>или нет то почему бы те не запустить это очко через CreateProcess
>а потом просто не обработать эту инфу ...
Нет, потому, что такой номер не пройдёт. Windows NT/2000/XP не даст DOS-программе копаться в портах компьютера.
Напоминаю, что мне нужно решение для Win32.
← →
AGGRESSOR (2003-03-03 15:09) [29]to BPK (02.03.03 14:16)
Сдаюсь. И у меня просьба: если все-таки найдешь решение, дай знать сюда, всем будет интересно (и обломно тоже).
← →
BPK (2003-03-07 14:41) [30]Автор EAC написал, что такого флага нет, и что он использует какой-то "тест" для определения состояния лотка. Интересно, что это за тест. Уж очень надёжный. Жду его ответа.
← →
JibSkeart (2003-03-08 16:24) [31]Если ты в своей проге нажал кнопку чтобы лоток открылся неужели нелзя узнать открыта она или нет ??
или ты вообшем ?
но у меня такое чувство что как то можно(у меня,да и не только, когда лоток выдвинут при завшении виндов или при перезагрузки задвигается обратно)
← →
AlexandrRya (2003-03-09 00:11) [32]Когда-то я давал ответ и пример в этом форуме, о том, как сделать, то что делает EAC. Не претендую на правильность и крастоу метода, но в принципе он работал. Делалось все примерно так:
fa - Буква диска.
procedure TOCCD.Execute;
const
AliasName = "MyCoolCD";
var s : string;
T:Cardinal;
begin
s := "open " +fa+ ": type cdaudio alias " + AliasName + paramstr(1) + " shareable wait";
mciSendString(PChar(s), nil, 0, 0);
T:=GetTickCount;
s := "set " + AliasName + fa + " door open wait";
if (mciSendString(PChar(s), nil, 0, 0)<>0) or
((GetTickCount-T)<100) then
begin
s := "set " + AliasName + fa + " door closed wait";
mciSendString(PChar(s), nil, 0, 0);
end;
end;
Принцип прцедура пытается выдвинуть лоток, при этом, если лоток не выдвинут, то на выполнение mciSendString(PChar(s), nil, 0, 0) уйдет время (не забывайте про параметр wait в команде - инче ничего работать не будет), которое больше 100 мс (наверное :)), если же лоток уже выдвинут, то функция почти моментально вернет управление. Именн это и проверяется, и если время меньше 100 мс, то мы задвигаем лоток.
Я долго искал другой метод, но ничего лучше не нашел. Теперь эта прга висит у меня в контекстном меню Explorer"a к сидюку с названием Извлечь/вставить.
← →
Rog (2003-03-09 06:23) [33]Удалено модератором
Примечание: Задай СВОЙ вопрос в отдельной своей ветке
← →
Anatoly Podgoretsky (2003-03-09 09:56) [34]AlexandrRya (09.03.03 00:11)
Это уже не определение состояния лотка, а имитация с выдвижением и обратным втыканием, аналогично отслеживанию попытке чтения диска в дисководе.
Просто нет сигнала о состоянии лотка, как в прочем и лотка может не быть, по крайней мере есть три типа CDROM - c kjnrhjv (самый распространенный), со щелью и с картриджем.
← →
Anatoly Podgoretsky (2003-03-09 09:57) [35]JibSkeart © (08.03.03 16:24)
Очень просто, для выполнения этой операции не требуется знать состояния лотка, достаточно дать команду закрыть
← →
Tano (2003-03-09 18:38) [36]Просто дополнительная информация:
Насчет "при загрузке винды лоток задвигается" - это происходит при перезагрузке аппаратуры. Все устройства получают аппаратный сигнал, по которому каждый переходит в начальное состояние (или то, которое на него похоже).
Самое интересное то, что мой Mitsumi 16/8/40 не задвигает каретку сам ни при включении ни при перезагрузке (такое встретил впервые, хотя сидюков видел много).
← →
JibSkeart (2003-03-11 09:31) [37]Anatoly Podgoretsky ©
Вполне Возможно :)
← →
Mad_Max (2003-03-12 07:29) [38]А у меня был сидюк... не помню какой фирмы... Он сам задвигал лоток через какое-то время, если его не закрыть вручную.
← →
BPK (2003-03-14 03:21) [39]>JibSkeart © (08.03.03 16:24)
>Если ты в своей проге нажал кнопку чтобы лоток открылся неужели >нелзя узнать открыта она или нет ??
>или ты вообшем ?
Но она-то не одна висит в памяти. А вдруг кто-нибудь ещё откроет или закроет лоток? Например, это может сделать пользователь с помощью кнопки на самом приводе.
>AlexandrRya (09.03.03 00:11)
Большое спасибо. Единственный дельный ответ.
Огромная просьба модератору: удалить все хохмы (и впредь не допускать такого), ибо они здесь не к месту.
← →
BPK (2003-03-14 12:48) [40]А вот что ответил автор EAC:
> AW> No, there is no such a flag for CD-ROM drives...
> AW> EAC uses a "guess" (test) whether the tray is open or not...
> I can say, that it is quite reliable test. Could you share the
> decision with me?
> Remark:
> I know that in MS-DOS there is such a flag. You must query CD-ROM
> driver through MSCDEX to get drive state word. Lower order bit of this
> word indicates the tray state.
> So I don"t know whether there is an hardware signal which could be get
> from drive or this is just an internal flag of CD-ROM driver, which
> also "guesses".
The guess is quite easy... The tray is a mechanical thing...
(By the way, this only works for open/close the tray - if it
is open, close it, if it is closed, open it...)
Send command for closing tray. If it immedately finishes,
assume that the tray was closed (and vice versa)
cu, Andre
Страницы: 1 2 вся ветка
Форум: "Система";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.01 c