Projekte > Optische Laufwerke > Laufwerke

Buchstaben

Für die Ermittlung der Laufwerksbuchstaben kann man die folgenden Funktionen verwenden:

  • GetLogicalDriveStrings
    function GetLogicalDriveStringsA(nBufferLength: DWORD; lpBuffer: PAnsiChar): DWORD;
  • GetDriveType
    function GetDriveTypeA(lpRootPathName: PAnsiChar): UINT;

Laut Dokumentation benötigen beide Funktionen mindestens Windows XP. Sie funktionieren auch unter Windows 2000 SP 4. Es gibt sie als Ansi- und als Wide-Version. Im folgenden werden die Ansi-Versionen verwendet.

In einem ersten Aufruf mit Leerparametern liefert GetLogicalDriveStrings die Länge der Stringliste für die Laufwerksbuchstaben. Anschließend wird Speicher für die Liste reserviert. Mit dem zweiten Aufruf, welcher als Parameter die Länge und den Pointer auf den reservierten Speicher enthält, bekommt man eine Liste. Die Liste sieht zum Beispiel so aus:

 
  C,:,\,#0,D,:,\,#0,E,:,\,#0,F,:,\,#0,G,:,\,#0,H,:,\,#0,I,:,\,#0,J,:,\,#0,K,:,\,#0
          

Mit der Funktion GetDriveType erhält man einen numerischen Wert, welcher den Typ des Laufwerkes wiedergibt:

  • 0 - DRIVE_UNKNOWN - Der Typ kann nicht festgestellt werden.
  • 1 - DRIVE_NO_ROOT_DIR - Das Verzeichnis ist kein Laufswerkswurzelverzeichnis.
  • 2 - DRIVE_REMOVABLE - Laufwerk mit Wechselmedien, z. B. Disketten.
  • 3 - DRIVE_FIXED - Laufwerk mit festen Medien, z. B. Festplatten.
  • 4 - DRIVE_REMOTE - Netzwerklaufwerk.
  • 5 - DRIVE_CDROM - CD-ROM-Laufwerk
  • 6 - DRIVE_RAMDISK - Laufwerk im Arbeitsspeicher.

Diesen Wert kann man entsprechend auswerten. In der Demo erfolgt die Ermittlung beispielsweise in einer Funktion:

 
  function TOptDrives.ReadDrives: Integer;
  {*****************************************************************************
  *  Die optischen Laufwerke ermitteln.
  }
  var
    nBufferLength : Integer;
    pDriveBuffer  : PAnsiChar;
    pDrive        : PAnsiChar;
  begin
    {
    ****************************************************************************
    *  Liste der optischen Laufwerke erstellen.
    }
    if Win32Platform = VER_PLATFORM_WIN32_NT
    then begin
      {
      *  Init
      }
      pDriveBuffer := nil;
      pDrive       := nil;
      {
      *  Vorhandene Laufwerksbuchstaben einlesen und Pointer übergeben.
      }
      nBufferLength := GetLogicalDriveStringsA(0, nil);
      if nBufferLength > 0
      then try
        GetMem(pDriveBuffer, nBufferLength * SizeOf(AnsiChar));
        if GetLogicalDriveStringsA(nBufferLength, pDriveBuffer) > 0
        then begin
          {
          *  Am Anfang Buffers steht das erste Laufwerk. Deshalb wird der
          *  Pointer des Buffers als Startpointer übergeben.
          }
          pDrive := pDriveBuffer;
          {
          *  Solange es einen Laufwerkseintrag gibt ...
          }
          while Length(pDrive) > 0
          do begin
            {
            *  den Typ des Laufwerks auf CD-ROM prüfen und ggfs eintragen.
            }
            if GetDriveTypeA(pDrive) = DRIVE_CDROM
            then begin
              SetLength(fDrive, Length(fDrive) + 1);
              fDrive[Length(fDrive) - 1].Drive  := pDrive;
              fDrive[Length(fDrive) - 1].Letter := pDrive[0];
            end;
            {
            *  Da die Laufwerkstrings mit einer #0 getrennt hintereinander
            *  stehen, wird der Pointer um die Länge des Strings und des Trenn-
            *  zeichens erhöht.
            }
            inc(pDrive, lStrLenA(pDrive) + 1);
          end;
        end;
      finally
        {
        *  Reservierten Speicher wieder freigeben.
        }
        FreeMem(pDriveBuffer);
        pDriveBuffer := nil;
        pDrive       := nil;
      end;
    end;
    Result := Length(fDrive);
  end;
          

Das Ergebnis des Beispiels sieht so aus:

Drive Letter (podDriveLetter.7z - 225 kb) MD5 (1 kb). Stand: 28. April 2013

Änderungen an der Demo

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