Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.05;
Скачать: CL | DM;

Вниз

Как узнать состояние лотка 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


 
app ©   (2003-03-14 12:55) [41]

BPK (14.03.03 03:21)
Ты перепутал персональную поддержку, с открытым форумом.
Второе к модераторам положено обращаться только по почте, обращение ф форумах не допустима, граничат с нарушением нетикета.


 
BPK   (2003-03-15 01:30) [42]

Если модераторы пропускают такую херотень, то судьбу форума я могу предсказать заранее. Я прошу не персональной поддержки, а просто не пропускать убогие по своему значению сообщения. Это касается ВСЕГО форума.
На моей памяти был один нормальный форум - "взаимопомощь" на Infoart (пока его не прикрыли). Там модераторы активно участвовали в процессе добавления вопросов и ответов и не стонали. В результате всегда можно было найти нужную информацию и было взаимопонимание.
Модераторы так же могли рассчитывать на помощь участников форума (хотя, это зависит от людей). А здесь приходится рыться в куче мусора, написанного кем-то, кому просто скучно одному дома.

Если, вдобавок ко всему, модераторы играют роль недоступного "его величества", до которого народу не достучаться, то я не могу понять, зачем вообще делали форум. Достучаться по E-mail я уже неоднократно пробовал. Безрезультатно. Не получил даже отказа.


 
BPK   (2003-03-15 01:33) [43]

P.S.
Один из признаков убогости форума - то, что модераторы позволяют обращаться участникам друг к другу на "ты" (теперь я вижу, что они и сами этим грешат), допускают фамильярность и выяснение отношений.


 
Lancelot ©   (2003-03-15 01:41) [44]


> BPK (14.03.03 12:48)
> А вот что ответил автор EAC:

Похоже, это тоже самое, что делает AlexandrRya.



Страницы: 1 2 вся ветка

Текущий архив: 2003.05.05;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.017 c
14-12923
KIR
2003-04-15 15:17
2003.05.05
IB+WinGate. Как это настраивается...


14-12903
Web
2003-04-17 08:44
2003.05.05
Траур


1-12809
anod
2003-04-22 01:12
2003.05.05
Проблемы с печатью формы


1-12696
salvo
2003-04-22 18:25
2003.05.05
StrToFloat


3-12612
Alex_t
2003-04-15 13:00
2003.05.05
Помогите с stored procedure