Projekte > Optische Laufwerke > Schublade

Öffnen

Zum Öffnen der Schublade wird die Funktion DeviceIoControl mit dem Controlcode IOCTL_CDROM_EJECT_MEDIA oder besser IOCTL_STORAGE_EJECT_MEDIA ausgeführt. Dies sieht zum Beispiel so aus:

function TOptDrives.GetDriveEject: Boolean;
{*******************************************************************************
*  Schublade des aktiven Laufwerkes öffnen.
}
var
  hDevice   : THandle;
  nReturned : Cardinal;
begin
  {
  *  Init
  }
  Result    := False;
  nReturned := 0;
  {
  *  Das Handle auf das Laufwerk holen.
  }
  hDevice := c;
  {
  *  Bei einem gültigen Handle den Öffnen-Befehl senden und das Handle wieder
  *  schließen.
  }
  if hDevice <> INVALID_HANDLE_VALUE
  then begin
    Result := DeviceIOControl(hDevice, IOCTL_STORAGE_EJECT_MEDIA,
                              nil, 0, nil, 0, nReturned, nil);
    CloseHandle(hDevice);
  end;
end;

Die Funktion DriveHandleRead holt das Handle nur mit Leserechten. Diese sind hier ausreichend.

function TOptDrives.DriveHandleRead: THandle;
{*******************************************************************************
*  Das Handle zum Lesen auf das aktive Laufwerk holen.
}
var
  lpFileName      : PAnsiChar;
  dwDesiredAccess : Cardinal;
  dwShareMode     : Cardinal;
begin
  lpFileName      := PAnsiChar(Format('\\.\%s:', [fDrive[fActive].Letter]));
  dwDesiredAccess := GENERIC_READ;
  dwShareMode     := FILE_SHARE_READ;
  Result          := CreateFile(lpFileName, dwDesiredAccess, dwShareMode,
                                nil, OPEN_EXISTING, 0, 0);
end;

Bei Laufwerken ohne Schublade wird das Medium ausgeworfen. Bei virtuellen Laufwerke dürfte der Befehl keine Wirkung haben.

Demo:

Tray Eject (podTrayEject.7z - 238 kb) MD5 (1 kb). Stand: 28. April 2013

Änderungen an der Demo

28.04.2013Kleine Überarbeitung und neuer Name.
08.04.2013Überarbeitung.