Projekte > Optische Laufwerke > Typ

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