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

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