Номер cd-привода в системе
От: limelight  
Дата: 26.08.06 04:43
Оценка:
Пользователь в диалоге "открыть файл" выбирает какой-то файл trackXX.cda с какого-то cd-привода. Как определить физический номер этого привода в системе, чтобы потом сграбить с него эту дорожку? Ситуация, когда у пользователя несколько cd-приводов, встречается нечасто, однако бывает, что установлены cd и dvd, и рипать дорожку с первого по счету привода уже ошибочно (первым может оказаться dvd).
Re: Номер cd-привода в системе
От: Аноним  
Дата: 26.08.06 10:42
Оценка:
Здравствуйте, limelight, Вы писали:

L>Пользователь в диалоге "открыть файл" выбирает какой-то файл trackXX.cda с какого-то cd-привода. Как определить физический номер этого привода в системе, чтобы потом сграбить с него эту дорожку? Ситуация, когда у пользователя несколько cd-приводов, встречается нечасто, однако бывает, что установлены cd и dvd, и рипать дорожку с первого по счету привода уже ошибочно (первым может оказаться dvd).


1. Предлагаю перенести тему в "Низкоуровневое программирование", т.к. здесь всё же идёт работа с устройствами, точнее с их именами.
2. Тебе нужен номер девайса. Его можно извлечь из символьной ссылки на устройство. Все устройства класса CdRom имеют ссылки вида:

\Device\CdRom0
\Device\CdRom1
...
\Device\CdRomX

Чтобы определить X, вызови

DWORD QueryDosDevice(
  LPCTSTR lpDeviceName,
  LPTSTR lpTargetPath,
  DWORD ucchMax
);


Первый параметр — имя диска. У тебя есть путь вида E:\trackXX.cda, так вот первые *две* буквы передаёшь как имя диска.
Второй параметр — буфер. Размера 512 байт вполне должно хватить (меньше не рекомендую). Это будет последовательность строк, разделённых нулевым символом.
Третий параметр — длина твоего буфера (512).

Если возвратит 0, значит ошибка. Проверь GetLastError() и если будет ERROR_INSUFFICIENT_BUFFER, значит буфер надо увеличить. Иначе — успех.

Буфер будет заполнен примерно так:

\Device\CdRomX<0>bla-bla-bla<0>bla-bla-bla-2<0><0>

Первая строка — как раз то, что надо. В любую свою функцию можешь смело передавать сам буфер, всё равно будет прочитана только первая строка до нулевого символа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.