Mit dem IOCTL_CDROM_DISC_TYPE control code kann man den Typ einer CD ermitteln. Das heißt, ob es eine DatenCD, eine AudioCD oder eine MixedCD ist. Im Dev Center der MSDN ist dieser control code nicht dokumentiert. Dazu benötigt man das DDK. Der control code ist in der Headerdatei Ntddcdrm.h definert. Diese findet sich zum Beispiel hier:
#define IOCTL_CDROM_DISK_TYPE
CTL_CODE(IOCTL_CDROM_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)
Die Function CTL_CODE ist zum Beispiel bei OSR Online erläutert. Die Konstanten finden sich in der Ntddcdrm.h und der devioctl.h (Zum Beispiel hier).
#define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM
#define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_ANY_ACCESS 0
#define METHOD_BUFFERED 0
Daraus ergibt sich dann in Delphi folgendes:
const
FILE_DEVICE_CD_ROM = $00000002;
IOCTL_CDROM_BASE = FILE_DEVICE_CD_ROM;
FILE_ANY_ACCESS = 0;
METHOD_BUFFERED = 0;
const
IOCTL_CDROM_DISK_TYPE = (IOCTL_CDROM_BASE shl 16) or
(FILE_ANY_ACCESS shl 14) or
($0010 shl 2) or
METHOD_BUFFERED;
Als Antwort erhält man eine CDROM_DISK_DATA Struktur. Diese und die für die Auswertung benötigten Konstanten sind ebenfalls in der Ntddcdrm.h definiert:
typedef struct _CDROM_DISK_DATA {
ULONG DiskData;
} CDROM_DISK_DATA, *PCDROM_DISK_DATA;
#define CDROM_DISK_AUDIO_TRACK (0x00000001)
#define CDROM_DISK_DATA_TRACK (0x00000002)
In Delphi ergibt sich:
type
TCDROM_DISK_DATA = record
DiskData : Cardinal;
end;
const
CDROM_DISK_AUDIO_TRACK = $00000001;
CDROM_DISK_DATA_TRACK = $00000002;
...
begin
...
{
* Handle holen.
}
dwDesiredAccess := GENERIC_READ;
dwShareMode := FILE_SHARE_READ;
aDevice := CreateFile(PAnsiChar(Format('\\.\%s:', [aDrive])),
dwDesiredAccess, dwShareMode,
nil, OPEN_EXISTING, 0, 0);
{
* CDD initialisieren.
}
FillChar(CDD, SizeOf(CDD), $00);
{
* Befehl ausführen.
}
if DeviceIoControl(aDevice, IOCTL_CDROM_DISK_TYPE, nil, 0, @CDD, SizeOf(CDD),
nReturned, nil) then
case cdd.DiskData and $03 of
CDROM_DISK_DATA_TRACK : Result := 'DatenCD';
CDROM_DISK_AUDIO_TRACK : Result := 'AudioCD';
CDROM_DISK_DATA_TRACK or CDROM_DISK_AUDIO_TRACK : Result := 'MixedCD';
end;
...
end;
Wenn kein Datenträger eingelegt ist, ergibt die Funktion den Fehler "Unzulässige Funktion.".
Demo, welche diese Funktion nutzt:

Medien Disc CDROM Disk Type (podDiscCDType.7z - 238 kb) MD5 (1 kb). Stand: 26. Februar 2012
Fr_An - Erstellt: 18. Februar 2012 - Letzte Änderung: 26. Februar 2012
seit 28. Juli 2010