состояние CDRom

Тема в разделе "WASM.WIN32", создана пользователем seiko, 11 дек 2007.

  1. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Как определить открыт CDRom или нет, с помощью MMSystem это можно сделать?
     
  2. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    CDRom не знает, открыт он или закрыт.
     
  3. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    ну если отправить комманду открытия, когда он открыт, или закрытия, когда он закрыт, и проверить на ошибки, в зависимости оттго удалась ли операция или нет, решать выполнить или нет противоположную. Или при отсылании комманды на CDRom, когда он уже закрыт или открыт нет ошибок, и так не получится?
     
  4. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    если нет ошибок, то засеки время выполнения действия, должно выполниться около 2х секунд, иначе относительно быстро . Но это надёжно только при низкой загруженности процессора и CDRom'а.
     
  5. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Twister
    щас. MECHANISM STATUS Command Operation code (BDh)
    MMSystem не курил, не знаю.
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    kaspersky
    а можно подробнее. тоже когда-то интересовался этим
     
  7. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Я просто делаю клавиатурную ловушку типа для добавления новых горячих клавиш конструкции WIN + какая-нить буква, и мне не хочется занимать две клавиши под CDRom поскольку меньше свободных остается в наличии,
    хочу поставить на WIN + C, и тут возникла эта проблема. Даже если в самой ловушке делать флаг, то это не панацея, тот же Alcohol или сам пользователь могут вдвигать и задвигать СDRom, ограничиться только открытием тоже плохо,
    поэтому можно поподробней про
    Код (Text):
    1. MECHANISM STATUS Command Operation code (BDh)
    это на си или дельфе сделать можно помимо масма, и че вообще эта штука делает?
     
  8. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    RamMerLabs
    это ATAPI команда. надеюсь, у тебя есть черновой стандарт с их описанием и ты знаешь как их передавать устройству? она прямо возвращает бит, указывающий открыт лоток или закрыт. единственные грабли, которые я встретил с ней - если носитель не загружен, то при первом обращении к приводу, некоторые модели считают лоток открытым, даже если он закрыт. но это их багофича такая. если дать команду, работающую с носителем, у таких приводов мы услышим как включается мотор задвигающий лоток и лоток дергается, после чего приводод говорит "ага! вот теперь лоток уж точно загружен".

    seiko
    > это на си или дельфе сделать можно помимо масма,
    можно хоть на бацике ;) другое дело, что это требеует прав админа...
    или установки ASPI32 драйвера от адаптек, который глючный как ладан.
    а так - набери в MSDN ключевое слово SPTI. там даже есть примеры сорцов на сях, в нете полго примеров на дельфинах. но в твоем случае можно не заморачиваться и просто юзать WM_DEVICECHANGE, что не требует прав админа и вообще позволяет забыть про ATAPI :)
     
  9. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    насчет WM_DEVICECHANGE:
    насколько я понял нужно писать глобальный перехват этого сообщения в дллке или можно без длл?
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    kaspersky
    пасиб за столь подробное описание бага этой команды, имеено из-за него я и отказался от использования MECHANISM STATUS, когда интересовался этим.
     
  11. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    seiko
    перехватывать ее не надо. она тебе и сама придет
    в MSDN есть пример, определяющий открытиые/закрытие сидюка с ее помощью
     
  12. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Че то ни фига не приходит
    Или я чего-то неправильно делаю:
    (заранее извиняюсь за дельфу)
    для того чтобы клавиатурный шпион работал нормально регистрю и создаю, но не показываю, невидимое окно и на сообщении о создании устанавливаю ловушку, на об уничтожении убираю, добавляю в case оконной процедуры WM_DEVICECHANGE
    Код (Text):
    1. WM_DEVICECHANGE:
    2.   If ((wParam=$8000) or (wParam=$8004)) and
    3.      (PDevBroadcastHdr(lparam)^.dbcd_devicetype=$2) then CDState:=not CDState;
    Где CDState - глобальная переменная, а тип PDevBroadcastHdr объявлен так
    Код (Text):
    1. type
    2. PDevBroadcastHdr = ^TDevBroadcastHdr;
    3. TDevBroadcastHdr = packed record
    4. dbcd_size: DWORD;
    5. dbcd_devicetype: DWORD;
    6. dbcd_reserved: DWORD;
    7. end;
    Уже потом на основании значения CDState вытаскиваю или закрываю CDRom,
    но беда в том, что CDState как был false так и остался, несмотря на выдвижение лотка

    Подскажите в чем может быть ошибка
     
  13. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    код не смотрел. сразу встречный вопрос - ты курил MDSN? с какого напаса начал кодить?
    а) Windows 95 and Windows NT send all top-level windows a WM_DEVICECHANGE message when...
    б) WM_DEVICECHANGE ходит под WM_COMMAND. см. ниже

    Код (Text):
    1. LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM uParam,        LPARAM lParam)
    2.  {
    3.    int wmId, wmEvent;
    4.    switch (message)
    5.    {
    6.         case WM_COMMAND:
    7.         wmId = LOWORD(uParam);
    8.         wmEvent = HIWORD(uParam);
    9.  
    10.         switch (wmId)
    11.         {
    12.                 case WM_DEVICECHANGE:                      
    13.                 /* твой код  */
    14.                  break;
    15. ....