Home | Kontakt | Sitemap

Start

Über mich

Kontakt

Sitemap

Lizenz

Anleitungen

DVD, miniDVD

SVCD

Audio, Audio-CD (CD-DA)

AVI

Software

Von Freunden und Bekannten

Eigene Programme

Programmierung

Delphi

Lazarus

Delphi/Lazarus

Projekte

MPEG-1/2 Video

Optische Laufwerke

Audio-CD (CDDA)

Raspberry Pi Dashcam

Verschiedenes

MPEG 2 Schnitt

Project X

VCD Easy

Hardlinks

Windows

Links

Software

Projekte | Optische Laufwerke Typ - CD, DVD, oder BD Laufwerk?

CD, DVD, oder BD Laufwerk?

Auch mit der ShellAPI kann man den Laufwerkstyp feststellen. Genauer mit der Funktion

DWORD_PTR SHGetFileInfo(
  _In_     LPCTSTR pszPath,
  DWORD    dwFileAttributes,
  _Inout_  SHFILEINFO *psfi,
  UINT     cbFileInfo,
  UINT     uFlags
);

Die Funktion ist in Delphi in der Unit ShellAPI bzw. Winapi.ShellAPI definiert:

{$EXTERNALSYM SHGetFileInfo}
function SHGetFileInfo(pszPath: LPCWSTR; dwFileAttributes: DWORD;
  var psfi: TSHFileInfo; cbFileInfo, uFlags: UINT): DWORD_PTR; stdcall;
{$EXTERNALSYM SHGetFileInfoA}
function SHGetFileInfoA(pszPath: LPCSTR; dwFileAttributes: DWORD;
  var psfi: TSHFileInfoA; cbFileInfo, uFlags: UINT): DWORD_PTR; stdcall;
{$EXTERNALSYM SHGetFileInfoW}
function SHGetFileInfoW(pszPath: LPCWSTR; dwFileAttributes: DWORD;
  var psfi: TSHFileInfoW; cbFileInfo, uFlags: UINT): DWORD_PTR; stdcall;

Der Funktion wird mit pszPath das Wurzelverzeichnis des Laufwerkes als Pointer (PChar) übergeben. Dazu die Variable für die Antwort, deren Größe und ein paar Flags. Mit den Flags wird angegeben welche Antworten gewünscht werden.

Die Antwortstruktur

type
  {$EXTERNALSYM _SHFILEINFOA}
  _SHFILEINFOA = record
    hIcon: HICON;                      { out: icon }
    iIcon: Integer;                    { out: icon index }
    dwAttributes: DWORD;               { out: SFGAO_ flags }
    szDisplayName: array [0..MAX_PATH-1] of  AnsiChar; { out: display name }
    szTypeName: array [0..79] of AnsiChar;             { out: type name }
  end;
  {$EXTERNALSYM _SHFILEINFOW}
  _SHFILEINFOW = record
    hIcon: HICON;                      { out: icon }
    iIcon: Integer;                    { out: icon index }
    dwAttributes: DWORD;               { out: SFGAO_ flags }
    szDisplayName: array [0..MAX_PATH-1] of  WideChar; { out: display name }
    szTypeName: array [0..79] of WideChar;             { out: type name }
  end;
  {$EXTERNALSYM _SHFILEINFO}
  _SHFILEINFO = _SHFILEINFOA;
  TSHFileInfoA = _SHFILEINFOA;
  TSHFileInfoW = _SHFILEINFOW;
  TSHFileInfo = TSHFileInfoA;

In szTypeName wird der Laufwerkstyp zurückgegeben wenn man das Flag SHGFI_TYPENAME im Aufruf verwendet. Allerdings wird nicht nach CD-, DVD- oder BD-Laufwerk unterschieden. Hier steht jeweils CD-Laufwerk. Bei Verwendung des Flag SHGFI_DISPLAYNAME wird bei den Cd-Laufwerken in szDisplayName der Laufwerkstyp, also CD, DVD oder BD sowie der Laufwerkbuchstabe und falls ein Datenträger eingelegt ist, dessen Bezeichnung angegeben.

Der Aufruf könnte so aussehen:

ShGetFileInfo(pDrive, 0,
              SHFileInfo, SizeOf (TSHFileInfo),
              SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or
              SHGFI_DISPLAYNAME or SHGFI_TYPENAME);

Wenn man den Aufruf mit der ersten Demo bei welcher die Buchstaben zu den Laufwerken ermittelt werden kombiniert, bekommt man so etwas wie diese Demo heraus:

CD or DVD or BD mit SHGetFileInfo (podSHGetFileInfo.7z - 214 kb) MD5 (1 kb). Stand: 9. Januar 2014

 

CD, DVD, HD DVD oder BD Laufwerk? > CD, DVD, oder BD Laufwerk? > Typ