Консультация № 141999
22.08.2008, 19:41
0.00 руб.
0 7 2
Здравствуйте, уважаемые эксперкты. Скажите:
1. Как получить список CD/DVD приводов?
2. Есть ли у CD/DVD идентификационный №. Если да, то как его программно считать?

Обсуждение

Неизвестный
22.08.2008, 19:55
общий
это ответ
Здравствуйте, Хукаленко Дмитрий!
Получить список носителей можно так, см приложение. Проседура GetDrive. Узнать тип носителя можно с помощью функции function GetDriveType см приложение GetDriveType.
По второму вопросу, извиняюсь, не помню, а информации нет под рукой.
Удачи.


Приложение:
procedure GetDrive;
var
ld: DWORD;
i: integer;
begin
ld := GetLogicalDrives;
for i := 0 to 25 do
if (ld and (1 shl i)) <> 0 then Memo1.Lines.Add(Char(Ord('A') + i) + ':\');
end;



procedure GetDriveType;
begin
case GetDriveType('C:\') of
0: ShowMessage('The drive type cannot be determined');
1: ShowMessage('The root directory does not exist');
DRIVE_REMOVABLE: ShowMessage('The disk can be removed');
DRIVE_FIXED: ShowMessage('The disk cannot be removed');
DRIVE_REMOTE: ShowMessage('The drive is remote (network) drive');
DRIVE_CDROM: ShowMessage('The drive is a CD-ROM drive');
DRIVE_RAMDISK: ShowMessage('The drive is a RAM disk');
end;
end;




Неизвестный
23.08.2008, 19:20
общий
В вопросе имеется в виду идентификационный номер конкретного CD/DVD диска или дисковода?
Неизвестный
24.08.2008, 22:19
общий
PavelGM, имеется в виду № диска.
Неизвестный
24.08.2008, 23:58
общий
monah, в строке "case GetDriveType('C:\') of" выдаёт ошибку "Too many actual parameters". В справке вроде написано, что нужен перечисляемый тип. Но я не догадался, что туда вставить :(
Неизвестный
25.08.2008, 10:25
общий
это ответ
Здравствуйте, Хукаленко Дмитрий!

2. Получение серийного номера диска - работает та же функция что и для HDD. См.приложение.

P.S. Кстати второй параметр возвращает метку диска - тоже может быть полезно.


Приложение:
procedure ShowSerialNum;
var sernum : Integer;
aVol : array [0..128] of Char;
lpMaximumComponentLength : DWORD;
lpFileSystemFlags : DWORD;
lpFileSystemNameBuffer : array[0..MAX_PATH] of Char;
begin
GetVolumeInformation('Z:\', avol, sizeof(avol), @sernum,
lpMaximumComponentLength, // address of system's maximum filename length
lpFileSystemFlags, // address of file system flags
lpFileSystemNameBuffer, // address of name of file system
sizeof(lpFileSystemNameBuffer)
);

ShowMessage(IntToHex(sernum, 8));
end;
Неизвестный
25.08.2008, 10:28
общий
С GetDriveType все правильно - может вы просто свою функцию также назвали? Вот и произошло перекрытие имен - тогда используйте разименователь:

case Windows.GetDriveType('C:\') of.
Неизвестный
25.08.2008, 19:15
общий
PavelGM , спасибо - дело действительно в этом. Я тупо скопировал код из приложения, а там и финкция и вызывающая процедура называются одинаково.
Форма ответа