Einzelnen Beitrag anzeigen

Takeo

Registriert seit: 15. Jul 2014
14 Beiträge
 
#1

Namen von Wechseldatenträger ermitteln

  Alt 15. Jul 2014, 10:11
Hallo liebe Community,

ich arbeite mit Delphi XE2 und habe folgendes Problem:

Ich möchte eine Combobox mit allen angeschlossenen USB-Sticks oder SD-Karten füllen. Dafür frage ich mit GetDriveType alle Laufwerkbuchstaben durch und fülle eine Liste mit allen, die auf "2" zutreffen (also Removeable_Drive).

Nun möchte ich dazu noch die Namen der Datenträger abfragen. Durch die Suche bin ich auf GetVolumeInformation gestoßen, was mir allerdings nur die Namen meiner Festplattenpartitionen zeigt und die Namen der Sticks bleiben leer.

Wie kann ich die Namen richtig abfragen? Gibt es eine Möglichkeit an die Namen aus der Registry zu gelangen? (Diese stehen ja als "FriendlyName" Schlüssel unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\S CSI für SD Karten)


Vielen Dank für eure Mithilfe,
Gruß Takeo


Was ich habe, aber nicht richtig funktioniert:

Delphi-Quellcode:
procedure TForm1.GetDrives;
var
  Drive: Char;
  DriveMask: Integer;
  Flag: Integer;
  FileInfo: SHFILEINFO;

begin
  DriveMask := GetLogicalDrives; //Bitmaske holen
  flag := 1; //Startflag setzen
  for Drive := 'Ato 'Zdo //Jeden Buchstaben gegenprüfen
  begin
    if (flag and DriveMask) <> 0 then
    begin
      if (GetDriveType(PChar(Format('%S:',[Drive]) ) ) = 2) then begin
         ComboPath.Add(Drive); //Laufwerkbuchstaben speichern
         ComboNames.Add(GetVolumeName(Drive)); //Name zum Laufwerk zuordnen

         SHGetFileInfo(PChar(Format('%S:\',[Drive])), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_LARGEICON);
         ComboIcons.Add(IconToBitmap(FileInfo.hIcon),nil);

      end;

    end;
    flag := flag shl 1; //Ein Bit weiter nach links gehen ( = flag * 2)
  end;
end;

function TForm1.GetVolumeName(DriveLetter: Char): string;
var
   dummy: DWORD;
   buffer: array[0..MAX_PATH] of Char;
   oldmode: LongInt;
begin
   oldmode := SetErrorMode(SEM_FAILCRITICALERRORS);
   try
     GetVolumeInformationW(PChar(DriveLetter + ':\'),
                          buffer,
                          SizeOf(buffer),
                          nil,
                          dummy,
                          dummy,
                          nil,
                          0);
     Result := StrPas(buffer);
   finally
     SetErrorMode(oldmode);
   end;
end;
  Mit Zitat antworten Zitat