Thema: Delphi CD- oder DVD-Laufwerk

Einzelnen Beitrag anzeigen

Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

CD- oder DVD-Laufwerk

  Alt 25. Jan 2012, 18:24
Über das Windows Device Management läßt sich mit der Funktion DeviceIoControl und dem ControlCode IOCTL_STORAGE_GET_MEDIA_TYPES_EX die Struktur GET_MEDIA_TYPES ermitteln, welche den Device Type (u.a. CD und DVD) enthält. Den Zugriff auf das Laufwerk erhält man mit CreateFile. Da nur lesender Zugriff benötigt wird, sollte es keine Rechteprobleme geben.

Der ControlCode IOCTL_STORAGE_GET_MEDIA_TYPES_EX und die Struktur GET_MEDIA_TYPES:
Delphi-Quellcode:
const
  FILE_DEVICE_CD_ROM = $00000002;
  FILE_DEVICE_MASS_STORAGE = $0000002d;
  FILE_DEVICE_DVD = $00000033;

const
  IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;

const
  METHOD_BUFFERED = 0;

const
  FILE_ANY_ACCESS = 0;

const
  IOCTL_STORAGE_GET_MEDIA_TYPES_EX = (IOCTL_STORAGE_BASE shl 16) or ($0301 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14);

type
  TGET_MEDIA_TYPES = packed record
    DeviceType : DWord;
    MediaInfoCount : DWord;
// MediaInfo : Array[0..0] of TDEVICE_MEDIA_INFO;
  end;
  PGET_MEDIA_TYPES = ^TGET_MEDIA_TYPES;
Die MediaInfo ist auskommentiert, da sie nicht benötigt wird.

Die Funktion:
Delphi-Quellcode:
function GetMediaType(sDrive: AnsiChar; out sType: AnsiString): Boolean;
{*******************************************************************************
*  Laufwerkstyp: CD, DVD, Unbekannt.
}

var
  hDevice : THandle;
  mediaTypes : PGET_MEDIA_TYPES;
  cBuffer : array [0..2047] of AnsiChar;
  nReturned : Cardinal;
begin
  Result := False;
  hDevice := CreateFileA(PAnsiChar(Format('\\.\%s:', [sDrive])), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0 );
  if hDevice <> INVALID_HANDLE_VALUE
  then begin
    nReturned := 0;
    Result := DeviceIoControl(hDevice, IOCTL_STORAGE_GET_MEDIA_TYPES_EX, nil, 0, @cBuffer, SizeOf(cBuffer), nReturned, nil);
    if Result
    then begin
      mediaTypes := @cBuffer;
      case mediaTypes.DeviceType of
        FILE_DEVICE_CD_ROM : sType := 'CD-ROM';
        FILE_DEVICE_DVD : sType := 'DVD';
        else sType := 'Unknown';
      end;
    end;
    CloseHandle(hDevice);
  end;
end;
Der Funktion wird das Laufwerksbuchstabe übergeben. Das Ergebnis der Funktion entspricht dem Ergebnis der Ausführung der Funktion DeviceIOControl. War die Ausführung erfolgreich bekommt man als Type CD-ROM, DVD oder unbekannt zurück.
Miniaturansicht angehängter Grafiken
cd-oder-dvd.png  
Angehängte Dateien
Dateityp: 7z CD_or_DVD.7z (1,7 KB, 27x aufgerufen)
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat