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/)
-   -   GetLogicalDrives und DiskSize/DiskFree (https://www.delphipraxis.net/216584-getlogicaldrives-und-disksize-diskfree.html)

Willie1 22. Jan 2025 19:35

GetLogicalDrives und DiskSize/DiskFree
 
Hallo,
weg vom blöden Norton:

GetLogicalDrives liefert die Buchstaben der wirklich vorhandenen Laufwerke.
Bei mir z.B. C:\ (Windows), D:\ (Recovery), E:\ (ext. Festplatte), K:\ (USB-Stick).

DiskSize und DiskFree(Zahl: Byte) liefert für alle Laufwerke 1-25) .. (u.a. USB-Anschlüsse) -1 zurück, wenn nichts angeschlossen ist aber auch, wenn sie gar nicht vorhanden sind. 0 = aktuelles Lw.

Meine Frage: kann ich zunächst GetLogicalDrives benutzen und dann mit Ord(Laufwerkbuchstabe)-64 Größe und freien Speicherplatz ermitteln? Ich habe 8 USB-Anschlüsse, die alle einen festen Buchstaben haben Ist das immer so? A und B (Disketten) gibt es nicht mehr, das weiß ich.

Gruß Willie.

jaenicke 22. Jan 2025 20:44

AW: GetLogicalDrives und DiskSize/DiskFree
 
Zitat:

Zitat von Willie1 (Beitrag 1545510)
DiskSize und DiskFree(Zahl: Byte) liefert für alle Laufwerke 1-25) .. (u.a. USB-Anschlüsse) -1 zurück, wenn nichts angeschlossen ist aber auch, wenn sie gar nicht vorhanden sind. 0 = aktuelles Lw.

Du kannst mit GetDriveType prüfen, was hinter dem Laufwerksbuchstaben steckt:
GetDriveType

Zitat:

Zitat von Willie1 (Beitrag 1545510)
Meine Frage: kann ich zunächst GetLogicalDrives benutzen und dann mit Ord(Laufwerkbuchstabe)-64 Größe und freien Speicherplatz ermitteln?

Ja, aber du solltest nach Typ unterscheiden.

Zitat:

Zitat von Willie1 (Beitrag 1545510)
Ich habe 8 USB-Anschlüsse, die alle einen festen Buchstaben haben Ist das immer so? A und B (Disketten) gibt es nicht mehr, das weiß ich.

Windows versucht, Laufwerksbuchstaben für das gleiche externe Laufwerk beim erneuten Anschluss erneut identisch zuzuweisen. Wird ein Laufwerk neu angeschlossen, wird ein Laufwerksbuchstabe neu vergeben.

Du kannst auch problemlos die Buchstaben A und B für Festplatten verwenden. Das habe ich auch schon gemacht, als ich nicht genügend andere Buchstaben mehr hatte.

jus 23. Jan 2025 18:01

AW: GetLogicalDrives und DiskSize/DiskFree
 
Nur als zusätzliche Idee, warum verwendest du nicht die WMI Abfragen. Ich habe nur kurz nachgeschaut, also mit "WMI Win32_DiskDrive" bekommst du alle physikalischen Laufwerke, die Grösse und ob es ein USB Laufwerk ist. Und über "Win32_DiskDriveToDiskPartition" in Verbindung mit "Win32_LogicalDiskToPartition" bekommst du dann die zugehörigen Laufwerksbuchstaben.

Willie1 23. Jan 2025 19:17

AW: GetLogicalDrives und DiskSize/DiskFree
 
Hallo,

ich habe mir was zusammen gebastelt, was funktioniert. Netzwerklaufwerk habe ich noch nicht ausprobiert Als Nerd fällt mir auf, dass Windows den Laufwerkbuchstaben ziemlich willkürlich vergibt. der eine USB-Stick hört auf G: , ein anderer am selben Anschluss auf K: . Wie gesagt, ich habe 8 USB's und noch den Kartenleser., der auch einen Buchstaben bekommt.

Ich muss bekennen, von WMI habe ich keine Ahnung. Ich habe mit eurer Hilfe mal Windows 11 mit dem alten Delphi 10 über WMI ermittelt. Das war's schon. Das aktuelle Delphi macht das ja direkt richtig.

Gruß Willie.

jus 24. Jan 2025 23:41

AW: GetLogicalDrives und DiskSize/DiskFree
 
Liste der Anhänge anzeigen (Anzahl: 2)
also ich muß zugeben, dass ich auch nicht der WMI Profi bin, aber als Ausgangspunkt verwende ich gerne für die WMI Quellcode Erzeugung den WMI Delphi Code Creator von der The Road to Delphi Seite(siehe auch angehängtes Foto). Die aktuelle Version findest du hier.
Der erzeugte Sourcecode von WMI Delphi Code Creator ist meist schon lauffähig. Der Quellcode von Button1 bis Button3 wurde mit dem WMI Delphi Code Creator erzeugt und geringfügig angepaßt. Ich denke, dass du mit den Infos theoretisch die Daten selber zusammenfügen kannst.

Als Bonus habe ich zufälliger Weise für die Zuordnung der Laufswerksbuchstaben ein funktionierendes Beispiel wieder von der The Road to Delphi Seite gefunden und in Button4 eingebaut.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    function getString( value: OLEVariant ): String;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  WbemUser           ='';
  WbemPassword       ='';
  WbemComputer       ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue       : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService  := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
    oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Caption         %s',[getString(FWbemObject.Caption)]));// String
      Memo1.Lines.Add(Format('DeviceID        %s',[getString(FWbemObject.DeviceID)]));// String
      Memo1.Lines.Add(Format('Index           %s',[getString(FWbemObject.index)]));// String
      Memo1.Lines.Add(Format('InterfaceType   %s',[getString(FWbemObject.InterfaceType)]));// Array of String
      Memo1.Lines.Add(Format('MediaType       %s',[getString(FWbemObject.MediaType)]));// Array of String
      Memo1.Lines.Add(Format('Model           %s',[getString(FWbemObject.Model)]));// String
      Memo1.Lines.Add(Format('SerialNumber    %s',[getString(FWbemObject.SerialNumber)]));// String
      Memo1.Lines.Add(Format('Size            %s',[getString(FWbemObject.Size)]));// Uint64
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  WbemUser           ='';
  WbemPassword       ='';
  WbemComputer       ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue       : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService  := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition','WQL',wbemFlagForwardOnly);
    oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Antecedent         %s',[String(FWbemObject.Antecedent)]));// String
      Memo1.Lines.Add(Format('Dependent         %s',[String(FWbemObject.Dependent)]));// String
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
const
  WbemUser           ='';
  WbemPassword       ='';
  WbemComputer       ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService  : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject  : OLEVariant;
  oEnum        : IEnumvariant;
  iValue       : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService  := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition','WQL',wbemFlagForwardOnly);
    oEnum        := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Antecedent         %s',[String(FWbemObject.Antecedent)]));// String
      Memo1.Lines.Add(Format('Dependent         %s',[String(FWbemObject.Dependent)]));// String
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
{
  ursprüngliche Quelle: https://theroadtodelphi.com/2011/10/25/wmi-tasks-using-delphi-%E2%80%93-disks-and-file-systems/
}
const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator    : OLEVariant;
  FWMIService      : OLEVariant;
  wmiDiskDrives    : OLEVariant;
  wmiDiskPartitions : OLEVariant;
  wmiLogicalDisks  : OLEVariant;
  wmiDiskDrive     : OLEVariant;
  wmiDiskPartition : OLEVariant;
  wmiLogicalDisk   : OLEVariant;
  oEnum            : IEnumvariant;
  oEnum2            : IEnumvariant;
  oEnum3            : IEnumvariant;
  iValue           : LongWord;
  DeviceID         : string;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService  := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  //Get the physical disk drive
  wmiDiskDrives := FWMIService.ExecQuery('SELECT Caption, DeviceID FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
  oEnum        := IUnknown(wmiDiskDrives._NewEnum) as IEnumVariant;
  while oEnum.Next(1, wmiDiskDrive, iValue) = 0 do
  begin
     //Use the disk drive device id to find associated partition
     DeviceID:=StringReplace(String(wmiDiskDrive.DeviceID),'\','\\',[rfReplaceAll]);
     wmiDiskPartitions := FWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="'+DeviceID+'"} WHERE AssocClass = Win32_DiskDriveToDiskPartition','WQL',wbemFlagForwardOnly);
     oEnum2          := IUnknown(wmiDiskPartitions._NewEnum) as IEnumVariant;
     while oEnum2.Next(1, wmiDiskPartition, iValue) = 0 do
     begin
        wmiLogicalDisks := FWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+String(wmiDiskPartition.DeviceID)+'"} WHERE AssocClass = Win32_LogicalDiskToPartition','WQL',wbemFlagForwardOnly);
        oEnum3          := IUnknown(wmiLogicalDisks._NewEnum) as IEnumVariant;
        while oEnum3.Next(1, wmiLogicalDisk, iValue) = 0 do
        begin
          Memo1.Lines.Add(Format('Drive letter associated with disk drive %s %s Partition %s is %s',[String(wmiDiskDrive.Caption),String(wmiDiskDrive.DeviceID),String(wmiDiskPartition.DeviceID),String(wmiLogicalDisk.DeviceID)]));
          wmiLogicalDisk:=Unassigned;
        end;
       wmiDiskPartition:=Unassigned;
     end;
    wmiDiskDrive:=Unassigned;
  end;
end;

function TForm1.getString( value: OLEVariant ): String;
begin
  if VarIsNull( value ) then result := ''
  else result := String( value );
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 Uhr.

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