Ich habe mal wieder versucht, mittels IOCTL zum Erfolg zu kommen.
Bei der Funktion:
Delphi-Quellcode:
Result := DeviceIOControl(DriveHandle,
IOCTL_STORAGE_CHECK_VERIFY,
NIL,
0,
NIL,
0,
nb,
NIL);
ist Result = False, wenn die Schublade geöffnet ist oder sich in der geschlossenen Schublade kein Datenträger befindet. Befindet sich in der Schublade ein Datenträger ist Result = True.
Mit der Funktion:
Delphi-Quellcode:
var
VolumeLabel : Array[0..$FF] of Char;
FileSystem : Array[0..$FF] of Char;
SerialNumber: DWord;
DW : DWord;
FileSysFlags: DWord;
...
begin
...
Result := GetVolumeInformation(PChar(Format('%s:\', [cDrive])),
VolumeLabel,
SizeOf(VolumeLabel),
@SerialNumber,
DW,
FileSysFlags,
FileSystem,
SizeOf(FileSystem));
lässt sich dann feststellen, was eingelegt ist. Bei einer bespielten CD bzw DVD ist Result = True und VolumeLabel gibt den Namen des Datenträgers und das FileSystem CDFS oder beispielsweise UDF zurück. Ist der Datenträger leer, ist in der Regel Result = False und die Fehlermeldung heißt: "Unzulässige Funktion". In der Regel bedeutet, dass ich beim Einlegen eines CD-Rohlings Result = True und FileSystem = '' erhielt. Wurde dann ein DVD-Rohling eingelegt war Result = False. Anschließend ergab ein CD-Rohling ebenfalls das Ergebnis 'Unzulässige Funktion'.
Nachtrag: In der
MSDN ist angegeben, dass IOCTL_STORAGE_CHECK_VERIFY keine Daten zurückliefert. Dem ist jedoch nicht so. Wenn man den lpOutBuffer verwendet, hat man einen Zähler, wie oft das Laufwerk geöffnet und geschlossen wurde. Der Zähler beginnt mit dem ersten Aufruf.