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 := 'A' to 'Z' do //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;