Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi CD- oder DVD-Laufwerk (https://www.delphipraxis.net/166006-cd-oder-dvd-laufwerk.html)

Garfield 25. Jan 2012 17:24

CD- oder DVD-Laufwerk
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ü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.

Coffeecoder 25. Jan 2012 17:54

AW: CD- oder DVD-Laufwerk
 
Hi,
Ich wollte mein Feedback abgeben zu dem Programm. Das Programm hat meine 2 DVD Laufwerke richtig erkannt.
Super :thumb:

Garfield 26. Jan 2012 06:50

AW: CD- oder DVD-Laufwerk
 
Vielen Dank für Dein Feedback. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz