C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 5 - mciSendCommand() и CD-ROM / MCI / Visual C++

Шаг 5 - mciSendCommand() и CD-ROM

Помимо функции mciSendString(), мы упоминали функцию mciSendCommand(). И сейчас ею конкретно займемся. Этот проект будет достаточно насыщенный, так что держитесь. Устройство выберем самое распространенное - CD-ROM.

Первым делом, прежде чем воспользоваться устройством, нам надо его открыть (это логично), т.е. узнать его ID. Нам понадобится для этого структура MCI_OPEN_PARMS:

typedef struct {
	DWORD dwCallback;
	MCIDEVICEID wDeviceID;
	LPCTSTR  lpstrDeviceType;
	LPCTSTR  lpstrElementName;
	LPCTSTR  lpstrAlias;
} MCI_OPEN_PARMS;

где:

  • dwCallback - для функции "возврата"
  • wDeviceID - возвращаемый идентификатор устройства
  • lpstrDeviceType - указатель на имя устройства
  • lpstrElementName - обычно путь до файла
  • lpstrAlias - указатель на буфер, содержащий alias устройство

После того, как мы узнали идентификатор устройства следующим действием следует проверить его на готовность. Для этого мы используем структуру MCI_STATUS_PARMS:

typedef struct {
	DWORD dwCallback;
	DWORD dwReturn;
	DWORD dwItem;
	DWORD dwTrack;
} MCI_STATUS_PARMS;

где:

  • dwCallback - смотрите выше
  • dwReturn - возвращаемая информация
  • dwItem - опрашиваемое свойство
  • dwTrack - параметр трека

Эта структура используется довольно часто. Скоро Вы в этом убедитесь.

Далее мы будем собирать информацию о диске. Для начала узнаем сколько треков на нем содержится, потом длину каждого трека (это нам понадобиться, чтобы определить его длительность в минутах и секундах) и, естественно, проверить тип трека, т.е. какую информацию он несет: цифровую или аудио. И в заключение определить длительность каждого трека.

Начнем с первого пункта. Открываем наше устройство:

// Объявляем структуру
MCI_OPEN_PARMS mciOpenParms;

// Присваиваем значение типа устройства
mciOpenParms.lpstrDeviceType = "cdaudio";

// Устанавливаем флаги, которые укажут интерфейсу, как нужно
// интерпретировать информацию в структуре mciOpenParms.
// В данном случае мы сообщаем MCI о том, что передаем ему тип
// устройства.
DWORD flags = MCI_OPEN_TYPE;

// Давайте рассмотрим, как эта функция будет использовать ту
// информацию, которую мы заложили. Начнем с первого параметра - 0.
// Так как мы не знаем еще идентификатор нашего устройства, поэтому
// просто устанавливаем его в 0. Второй параметр говорит MCI, что мы
// хотим открыть устройство, имя которого она извлечет из структуры
// mciOpenParms. По поводу третьего параметра смотрите выше. И,
// наконец, последним параметром нашей функции будет указатель на
// структуру из которой она извлечет необходимые ей данные. В данном
// случае, как я уже говорил, имя устройства.

DWORD resume = mciSendCommand(0, MCI_OPEN, flags,
	(DWORD) (LPVOID)& mciOpenParms);

// Если все было в порядке, получаем идентификатор устройства
if (resume == 0)
	wDeviceID = mciOpenParms.wDeviceID;

Следующее, что мы должны сделать по списку, это проверить устройство на готовность:

// Т.к. мы опрашиваем устройство, то заполняем соответствующий
// элемент структуры MCI_STATUS_PARMS - dwItem. Флаг
// MCI_STATUS_READY как раз и определяет устройство на готовность.
mciStatusParms.dwItem = MCI_STATUS_READY;

// В качестве первого параметра передаем идентификатор устройства.
// Второй параметр - это команда, которая связана со структурой
// MCI_STATUS_PARMS и которая извлекает информацию об устройстве.
// Третий параметр, даже не знаю как сказать...подтверждает то,
// что информация, которой мы заполнили структуру, относиться
// только к свойствам устройства. Ну и последним параметром мы
// передаем указатель на структуру MCI_STATUS_PARMS.
mciSendCommand(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM,
	(DWORD)& mciStatusParms);

Если устройство у нас готово, то переходим к третьему пункту. Узнаем количество треков. Код я приводить не буду, т.к. далее все идет по аналогии. Опять мы хотим получить интересующую нас информацию. По этому будем продолжать использовать структуру MCI_STATUS_PARMS, только команда у нас поменяется и станет MCI_STATUS_NUMBER_OF_TRACKS, которую мы отправим в dwItem.

Теперь давайте определим длину каждого трека. Как я уже говорил это нам нужно, что бы узнать время проигрывания трека. Для того, что бы определить длину ,к примеру n-ого трека, нам следует обратиться по номеру этого трека. Как Вы уже догадались этот номер мы поместим в dwTrack структуры MCI_STATUS_PARMS, а команду определения длинны трека -MCI_STATUS_LENGTH в dwItem. Здесь мы уже начали работать непосредственно с треками, и я прошу акцентировать ваше внимание на третьем пераметре функции mciSendCommand(). В этом случае необходимо к флагу MCI_STATUS_ITEM добавить еще и флаг MCI_TRACK. Это очень важно.

Проверим информацию о типе трека. Записываем номер трека в dwTrack, а в dwItam команду проверки трека - MCI_CDA_STATUS_TYPE_TRACK. После извлекаем из структуры результат, который храниться в dwReturn и сравниваем с MCI_CDA_TRACK_AUDIO. Если значения равны, то трек к которому мы обратились несет аудио информацию.

И последнее, что нам осталось - это определить время проигрывания треков. Для этого воспользуемся функциями MCI_MSF_MINUTE() и MCI_MSF_SECOND(). Передаваемым значением является длинна трека.


Загрузить проект | | |
Автор Владимир Потапов.
[AD]