![]() |
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. |
AW: GetLogicalDrives und DiskSize/DiskFree
Zitat:
![]() Zitat:
Zitat:
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. |
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.
|
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. |
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
![]() ![]() 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 ![]()
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