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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2007, 13:47   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию состояние CDRom

Как проверить открыт CDRom или закрыт
шарился в справке win32sdk.hlp по MMSystem но не нашел что нужно
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 11.12.2007, 20:17   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

однозначного решения нет. можно исходить из того что специально закрыть его, и уже потом "плясать" от того что точно CD-ROM закрыт и при надобности открыть его.
rpy3uH вне форума Ответить с цитированием
Старый 12.12.2007, 11:15   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Решение есть, т.к. некоторые либы типа basscd умеют это правильно определять. Печенью чувствую - чёта с IOCTL, но что конкретно даже не представляю
пыщь
JTG вне форума Ответить с цитированием
Старый 13.12.2007, 14:29   #4
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

а если отправить комманду открытия, когда он открыт, или закрытия, когда он закрыт, и проверить на ошибки, в зависимости оттго удалась ли операция или нет, решать выполнить или нет противоположную. Или при отсылании комманды на CDRom, когда он уже закрыт или открыт, нет ошибок, и так не получится?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 13.12.2007, 16:20   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Может конечно и получится, но хотелось бы знать состояние привода без изменения его состояния (ну вообщем вы поняли )
пыщь
JTG вне форума Ответить с цитированием
Старый 18.12.2007, 06:09   #6
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Мне вроде рассказали про способ с WM_DEVICECHANGE
по идее нужно просто обработать в очереди любого окна это сообщение
(ловушку не надо, вроде), но не работает

вот мой незатейливый алгоритм

для того, чтобы клавиатурный шпион работал нормально, регистрю и создаю, но не показываю, невидимое окно и на сообщении о создании устанавливаю ловушку, на об уничтожении убираю, добавляю в case оконной процедуры WM_DEVICECHANGE

Код:
WM_DEVICECHANGE:
  If ((wParam=$8000) or (wParam=$8004)) and
     (PDevBroadcastHdr(lparam)^.dbcd_devicetype=$2) then CDState:=not CDState;
Где CDState - глобальная переменная, а тип PDevBroadcastHdr объявлен так

Код:
type 
PDevBroadcastHdr = ^TDevBroadcastHdr; 
TDevBroadcastHdr = packed record 
dbcd_size: DWORD; 
dbcd_devicetype: DWORD; 
dbcd_reserved: DWORD; 
end;
Уже потом на основании значения CDState вытаскиваю или закрываю CDRom,
но беда в том, что CDState как был false так и остался, несмотря на выдвижение лотка

Подскажите в чем может быть ошибка
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 18.12.2007, 14:37   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код может и верный, но WM_DEVICECHANGE реагирует на открытие/закрытие лотка только если там есть диск
пыщь
JTG вне форума Ответить с цитированием
Старый 19.12.2007, 17:14   #8
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
По умолчанию

Цитата:
Сообщение от joker Посмотреть сообщение
Как проверить открыт CDRom или закрыт
шарился в справке win32sdk.hlp по MMSystem но не нашел что нужно
Вот не знаю код рабочий или нет непроверял просто читал твою тему а на днях наткнулся на это
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
   s: array[0..64] of Char;
   error: Cardinal;
   Text: array[0..255] of Char;
 begin
   error := mciSendstring('open cdaudio alias geraet', nil, 0, Handle);
   if error <> 0 then
   begin
     mciGetErrorstring(error, @Text, 255);
     ShowMessage(text);
     mciSendstring('close geraet', nil, 0, Handle);
     Exit;
   end;

   error := mciSendstring('status geraet mode', @s, SizeOf(s), Handle);
   if error <> 0 then
   begin
     mciGetErrorstring(error, @Text, 255);
     ShowMessage(Text);
     mciSendstring('close geraet', nil, 0, Handle);
     Exit;
   end;

   mciSendstring('close geraet', nil, 0, Handle);
   ShowMessage( s);
 end;
I like WPF
kommunist вне форума Ответить с цитированием
Старый 20.12.2007, 13:04   #9
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Цитата:
Код может и верный, но WM_DEVICECHANGE реагирует на открытие/закрытие лотка только если там есть диск
Хм, то есть WM_DEVICECHANGE приходит лишь когда вставляют диск в дисковод?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 20.12.2007, 13:39   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Приходит если открыть или закрыть дисковод, когда там есть диск.
Цитата:
When the user inserts a new compact disc or DVD into a drive, applications get a WM_DEVICECHANCE message with a DBT_DEVICEARRIVAL event. The application must check the event to make sure that the type of device arriving is a volume (DBT_DEVTYP_VOLUME) and that the event's media flag (DBTF_MEDIA) is set.

When the user removes a compact disc from a CD-ROM drive or DVD, applications will get a WM_DEVICECHANCE message with a DBT_DEVICEREMOVECOMPLETE event. As with DBT_DEVICEARRIVAL above, the application must check the event to make sure that the device being removed is a volume and that the event's media flag is set.
Кстати исходники basscd не распостраняются, но в ридми написано, что либу делали на основе akrip - http://akrip.sourceforge.net/
пыщь

Последний раз редактировалось JTG; 20.12.2007 в 13:47.
JTG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать состояние подключения Hottabych Работа с сетью в Delphi 8 03.03.2008 18:10
сделать так, чтобы ProgressBar показывал состояние копирования папки wolk Компоненты Delphi 3 23.03.2007 23:25