Конференция "Media" » Подскажите, как можно проверить открыт ли CD-ROM [D7, WinXP]
 
  • СССР (26.08.08 19:47) [0]
    Доброе время суток
    Подскажите, как можно проверить открыт ли CD-ROM, желательно с примерам кода.
  • МистерТ (27.08.08 09:09) [1]
    1) удостовериться, что к компьютеру подключена веб-камера
    2) выдать пользователю окошко с просьбой навести камеру на CD-ROM
    3) прогнать полученную с камеры картинку через модуль распознания изображения и сравнить с эталонной картинкой открытого CD-ROM
    мелочами типа юстировки направления "взгляда" камеры можно принебречь, если составить хорошую базу фотографий открытого CD-ROM с разных ракурсов.
  • {RASkov} © (27.08.08 11:12) [2]
    http://yandex.ru/yandsearch?clid=9582&text=%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C+%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82+%D0%BB%D0%B8+CD-ROM
    Но у меня способ из первых ссылок не сработал, поэтому я сразу не стал отвечать, но после [1].... толи присоединится к первому посту, толи... :)
    Я не задавался таким вопросом, возможно есть способ "более менее 100-процентный", но так же нужно учитывать, что приводы могут и не иметь лотка для CD т.е. выдвигаться там нечему... Может еще какие нюансы есть, как например маленький нюансик - кол-во приводов в системе...
  • han_malign © (29.08.08 16:10) [3]
    номер раз http://www.rsdn.ru/article/baseserv/scsi.xml
    номер три(глобальный) http://www.t10.org/
    номер два(конкретный, но на Ц и для wnaspi32(NT/2000/9X))
    int haid, target, lun;
    DWORD dwResult;

    haid = atoi(argv[1]);

    if (argc < 3) target = 0;
       else target = atoi(argv[2]);

    if (argc < 4) lun = 0;
       else lun = atoi(argv[3]);

    dwResult = GetASPI32SupportInfo();
    if (BYTE(dwResult >>8) != SS_COMP)
       {
        printf("Error: SCSI %Xh. Initializaton failed.\n", BYTE(dwResult >> 8));
        return 1;
        }


    HANDLE hEvent;

    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (hEvent == NULL)
       {
        printf("Error: System %Xh. Can not create event.\n", GetLastError());
        return 2;
        }


    SRB_ExecSCSICmd esc;
    BYTE buf[8];

    ZeroMemory(buf, 8);

    ZeroMemory(&esc, sizeof(SRB_ExecSCSICmd));
    esc.SRB_Cmd  = SC_EXEC_SCSI_CMD;
    esc.SRB_HaId = haid;
    esc.SRB_Flags = SRB_EVENT_NOTIFY | SRB_DIR_IN;
    esc.SRB_Target = target;
    esc.SRB_Lun = lun;
    esc.SRB_SenseLen = SENSE_LEN;
    esc.SRB_BufLen = 0x8;
    esc.SRB_BufPointer = buf;
    esc.SRB_CDBLen = 10;
    esc.SRB_PostProc = hEvent;
    esc.CDBByte[0]  = 0x4A; // SCSI Command (Get Event/Status Notification)
    esc.CDBByte[1]  = 0x1;  // IMMED is set
    esc.CDBByte[2]  = 0x0;
    esc.CDBByte[3]  = 0x0;
    esc.CDBByte[4]  = 0x10; // Notification Class (Media Status Class Event)
    esc.CDBByte[5]  = 0x0;
    esc.CDBByte[6]  = 0x0;
    esc.CDBByte[7]  = 0x0;  // Allocation Lenght MSB
    esc.CDBByte[8]  = 0x8;  // Allocation Length LSB
    esc.CDBByte[9]  = 0x0;  

    dwResult = SendASPI32Command((LPSRB)&esc);
    if (dwResult == SS_PENDING)
       {
        dwResult = WaitForSingleObject(hEvent, INFINITE);
        if (dwResult == WAIT_FAILED)
           {
            dwResult = GetLastError();
            CloseHandle(hEvent);
            printf("Error: System %Xh. Waiting failed.\n", dwResult);
            return 3;
            }

        dwResult = esc.SRB_Status;
        }

    CloseHandle(hEvent);

    if (dwResult != SS_COMP)
       {
        printf("Error: SCSI %Xh. SCSI command failed.\n", esc.SRB_Status);
        return 4;
        }


    if ((buf[2] & 0x7) == 4) printf("Result: door %s\n", (buf[5] & 0x1) ? "open" : "closed");
       else printf("Result: door status unknown.\n");


    - осталось срастить номер раз и номер два...
  • KilkennyCat © (30.08.08 23:43) [4]
    Мне способ с веб-камерой кажется наиболее достоверным, но я бы все-таки использовал старую мышь.
    Мышь разобрать, и прикрепит одним из наиболее удобных способов напротив лотка сидирома так, чтобы при выдвижении он нажимал на кнопку или перекрывал фотодатчик. Если мышь с колесиком, то прикрепить так, чтобы лоток прокручивал колесико, это позволит анализировать не только состояния "открыт" "закрыт" но и собственно процесс.
 
Конференция "Media" » Подскажите, как можно проверить открыт ли CD-ROM [D7, WinXP]
Есть новые Нет новых   [133926   +461][b:0][p:0.002]