Пользователь в диалоге "открыть файл" выбирает какой-то файл trackXX.cda с какого-то cd-привода. Как определить физический номер этого привода в системе, чтобы потом сграбить с него эту дорожку? Ситуация, когда у пользователя несколько cd-приводов, встречается нечасто, однако бывает, что установлены cd и dvd, и рипать дорожку с первого по счету привода уже ошибочно (первым может оказаться dvd).
Здравствуйте, 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>
Первая строка — как раз то, что надо. В любую свою функцию можешь смело передавать сам буфер, всё равно будет прочитана только первая строка до нулевого символа.