Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Laufwerksbezeichnung wie in Windows (https://www.delphipraxis.net/77654-laufwerksbezeichnung-wie-windows.html)

Mazel 22. Sep 2006 13:44


Laufwerksbezeichnung wie in Windows
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich möchte die Laufwerksbezeichnungen wie in Windows (siehe Bildanhang) erhalten. Ich habe mich nun ein wenig mit WMI beschäftigt, da das ein Weg ist, die Bezeichnung zu erhalten. Vorher hatte ich es über GetDriveType gemacht. Das Problem bei GetDriveType ist das ich mit DRIVE_CDROM nur ermitteln kann, ob es sich um ein CD oder DVD Laufwerk (was von beiden weis ich da nicht) oder bei DRIVE_REMOVABLE um ein Wechselmedium, was auch ein Diskettenlaufwerk sein kann, handelt. Daher hab ich den Weg über WMI genommen. Dort funktioniert das zwar besser aber auch da bekomme ich für CD-DVD Laufwerke nur "CD_ROM Laufwerk" als Beschreibung oder bei Diskettenlaufwerken nur "Diskettenlaufwerk" als Beschreibung. In Windows-Arbeitspaltz steht aber für Diskette 3 1/2-Diskette, DVD-Laufwerk und CD-RW Laufwerk.

Meine Frage nun, wo liest Windows diese Bezeichnungen aus?

Gruß
Mazel

uwewo 22. Sep 2006 13:58

Re: Laufwerksbezeichnung wie in Windows
 
Windows liest den Namen des Laufwerks aus, wenn es keinen findet schreibt es stattdessen einfach den Typ des Laufwerks. "CD Drive ( F: )"

Gib Deinem Laufwerk einen Namen dann wirst Du es sehen.

Mazel 22. Sep 2006 15:05

Re: Laufwerksbezeichnung wie in Windows
 
Woher weis es dann aber das es ein CD-RW-Laufwerk oder ein DVD-Laufwerk ist, wie es im Anhang zu sehen ist?

Gruß
Mazel

Nighthawk1310 22. Sep 2006 15:25

Re: Laufwerksbezeichnung wie in Windows
 
Zitat:

Zitat von uwewo
Windows liest den Namen des Laufwerks aus...

Windows liest nicht direkt einen Namen aus sondern nur den konkreten Typ und die Bezeichnung des Laufwerkes und ich rate einfach mal, dass es das beim Treiber macht und stellt diesen dann für alles andere zu Verfügung. Der Explorer und/oder andere Programme, die es wissen wollen können dies dann über die API auslesen.

ich habe zwar selbst keine ahnung mehr woher ich die beiden funktionen habe,
aber bitte schön:

Delphi-Quellcode:
function GetVolumeLabel(Drive:char):string;
var VolLab:array [0..max_path] of char;
    MaxLength,SysFlag:DWord;
    OldErrorMode:integer;
begin
  OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    if GetVolumeInformation(PChar(drive+':\'), VolLab, 255,
                       nil, MaxLength,
                       SysFlag, nil, 255) then Result:=vollab;
  finally
    SetErrorMode(OldErrorMode);
  end;
end;

und das hier:

Delphi-Quellcode:
function GetDriveShellDesc ( const Drive : Char) : string;
var rootpathname : string;
    namebuffer : string;
    maximumcomponentlength : dword;
    filesystemflags : dword;
    filesystemnamebuffer : string;
begin

   rootpathname := drive+':\'; // build the rootpath for our api

   // predefine buffers
   setlength(namebuffer,25) ;
   setlength(filesystemnamebuffer,500) ;

   // call the api
   if getvolumeinformation (           // returns boolean true if succeeded
      pchar(rootpathname),
      pchar(namebuffer),
      24,
      Nil,
      maximumcomponentlength,
      filesystemflags,
      pchar(filesystemnamebuffer),
      499)

   // build the resulting dword
   then begin
       Result := StrPas ( PChar (NameBuffer) )+' ('+UpCase(Drive)+':)';
   end
   else begin
       Result := UpCase(Drive)+':\';
   end;

end;

Mazel 22. Sep 2006 16:09

Re: Laufwerksbezeichnung wie in Windows
 
Hi,

diese beiden Funktionen lesen den Volumename aus, den man einer Partion auf der Festplatte geben kann, nicht aber den richtigen Typ.

Folgende Shemas sollen verdeutlichen was ich haben möchte:

a) so will ich es haben:

Delphi-Quellcode:
Volumename: Main        kein Name       kein Name           //über GetVolumeInfo
Drive:      C:\          F:\              G:\
Typ:        Laufwerk    DVD-Laufwerk    CD-RW-Laufwerk      //über GetDriveType oder anders
b) so ist es bisher:

Delphi-Quellcode:
Volumename: Main        kein Name       kein Name           //über GetVolumeInfo
Drive:      C:\          F:\              G:\
Typ:        Laufwerk    CD-DVD Laufwerk CD-DVD Laufwerk     //über GetDriveType
Ich kann über GetDriveType bei ROM-Laufwerken nur erkennen ob es ein CD-DVD Lauferk ist, nicht aber ob es ein DVD-Laufwerk oder ein CD-RW-Laufwerk ist.
Ähnlich ist es bei WMI auch dort bekomme ich nur CD-ROM LAufwerk, mehr leider nicht.

Wie kann ich das aber realisieren?

Gruß
Mazel

Mazel 22. Sep 2006 17:07

Re: Laufwerksbezeichnung wie in Windows
 
Ich habe das gefunden was ich brauche. Folgende Funktion liefert mir sogar noch weitere Infos und die Laufwerksicons:

Delphi-Quellcode:
var
  FileInfo:    TSHFileInfo;

begin
  SHGetFileInfo(PAnsiChar('C:\'),
                0,
                FileInfo,
                SizeOf(FileInfo),
                SHGFI_ICON or
                SHGFI_LARGEICON or
                SHGFI_TYPENAME or
                SHGFI_DISPLAYNAME or
                SHGFI_SYSICONINDEX);
  Image1.Picture.Icon.handle:=FileInfo.hIcon;
  Lb1.Caption := FileInfo.szDisplayName;
  Lb2.Caption := FileInfo.szTypeName;
Gruß
Mazel

Igotcha 2. Okt 2006 21:21

Re: Laufwerksbezeichnung wie in Windows
 
In welcher Unit ist denn TSHFileInfo deklariert?

Mein BDS2006 findet dazu nichts.

Gruß Igotcha

Christian Seehase 2. Okt 2006 23:43

Re: Laufwerksbezeichnung wie in Windows
 
Moin Igotcha,

dazu müsstest Du die Unit Shellapi einbinden.

Garfield 3. Okt 2006 07:48

Re: Laufwerksbezeichnung wie in Windows
 
In dem Thema http://www.delphipraxis.net/internal...ct.php?t=80846 ist im letzten Beitrag ein Projekt, mit welchen man Infos zu CD/DVD-Laufwerken auslesen kann, angehangen (EXE und Source).


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz