Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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. Не претендую на правильность и крастоу метода, но в принципе он работал. Делалось все примерно так:

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;
fa - Буква диска.
Принцип прцедура пытается выдвинуть лоток, при этом, если лоток не выдвинут, то на выполнение 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
7-12952
Zyb
2003-03-12 13:45
2003.05.05
Вопрос по COM порту


9-12603
ProNix
2002-11-29 16:06
2003.05.05
Срочно !!!!!!!!!!!!!


3-12610
Jaxtor
2003-04-15 13:56
2003.05.05
Ошибка при выполнении Insert


1-12772
Зинец Виктор
2003-04-22 10:06
2003.05.05
Q: как при запуске сделать главную форму невидимой?


14-12866
AlexG
2003-04-16 14:55
2003.05.05
AVP - автозагрузка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский