![]() |
GetVolumeinformation
Hi,
Ich möchte ein Programm schreiben, welches Informationen über Laufwerke (CD/DVD/HDD etc), mit der Funktion GetVolumeInformation ausliest. Ich habe ein erstes Programm in Delphi Win32 geschrieben, welches super funktionierte. Um die Funktionalität meines Programmes zu erweitern habe ich dann das gleiche Projekt nochmal mit Delphi.Net angefangen. Es mussten einige Variablen umgechrieben werden, etc. Eigentlich alles nicht so das Problem. Doch merkwürdigerweise bekomme ich nur noch leere Variablen von der Funktion GetVolumeInformation zurück.
Delphi-Quellcode:
In der MSDN (
procedure TForm4.ComboBox1Change(Sender: TObject);
var Drive: string; drive_buffer: StringBuilder; drive_sn: cardinal; drive_temp : cardinal; Sys_flags: cardinal; file_system: Stringbuilder; begin Listbox1.Items.Clear; drive_buffer := stringbuilder.Create; file_system := stringbuilder.Create; Drive := combobox1.Text; //Laufwerksbuchstabe GetVolumeinformation(Drive,drive_buffer,sizeof(drive_buffer),drive_sn, drive_temp,sys_flags, file_system, sizeof(file_system)); //Ausgabe Listbox1.Items.Add(Drive); Listbox1.Items.Add('Name: ' + drive_buffer.tostring()); Listbox1.Items.Add('Serialnumber: ' + inttostr(drive_sn)); Listbox1.Items.Add('Filesystem: ' + file_system.tostring()); end; ![]() Kurz und knapp - Kompilieren geht, die Ausgabe in der Listbox bleibt leer und ich habe keinen Plan warum, weil ich mich mit .Net noch nicht so auskenne. |
Re: GetVolumeinformation
Habs eine ganze Weile gegoogelt und dann herausgefunden.
So mach ich's jetzt:
Delphi-Quellcode:
drive_buffer := stringbuilder.Create(MAX_PATH+1); file_system := stringbuilder.Create(MAX_PATH+1); Drive := combobox1.Text; //Laufwerksbuchstabe GetVolumeinformation(Drive,drive_buffer,drive_buffer.capacity,drive_sn, drive_temp,sys_flags, file_system, file_system.Capacity); |
Re: GetVolumeinformation
Hi,
ich versuche gerade den hier vorgeschlagenen Code auszuprobieren. (Delphi 2006) Aber ich stolpere darüber, dass ich nirgendwo die erforderliche Unit, oder sonstiges finde damit ich den Code auch übersezt bekomme. Was muss da noch zur Uses-Klausel hinzugefügt werden? |
Re: GetVolumeinformation
"Header Declared in Winbase.h; include Windows.h."
Auszug aus der MSDN, demnach müsste es ausreichen Windows in die Uses einzubinden. greez |
Re: GetVolumeinformation
Zitat:
|
Re: GetVolumeinformation
So würde ich das machen
Delphi-Quellcode:
unit DriveInfoUnit;
interface uses System.Runtime.InteropServices, System.Text; type DriveInfo = class(System.Object) strict private _name: System.String; [DllImport('kernel32.dll', CharSet=CharSet.Auto, SetLastError=true)] class function GetVolumeInformation( lpRootPathName: System.String; lpVolumeNameBuffer: StringBuilder; nVolumeNameSize: Integer; var lpVolumeSerialNumber: Integer; var lpMaximumComponentLength: Integer; var lpFileSystemFlags: Integer; lpFileSystemNameBuffer: StringBuilder; nFileSystemNameSize: Integer): boolean; static; [DLLImport('kernel32.dll')] class function GetLastError: Integer; static; public constructor Create(driveName: string); function get_VolumeLabel: String; property VolumeLabel: String read get_VolumeLabel; end; implementation { DriveInfo } constructor DriveInfo.Create(driveName: string); begin inherited Create(); if (driveName = nil) then raise NullReferenceException.Create('driveName'); Self._name := driveName; end; class function DriveInfo.GetLastError: Integer; begin end; class function DriveInfo.GetVolumeInformation(lpRootPathName: System.String; lpVolumeNameBuffer: StringBuilder; nVolumeNameSize: Integer; var lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags: Integer; lpFileSystemNameBuffer: StringBuilder; nFileSystemNameSize: Integer): boolean; begin end; function DriveInfo.get_VolumeLabel: String; var lpVolumeNameBuffer: StringBuilder; nVolumeNameSize: Integer; lpVolumeSerialNumber: Integer; lpMaximumComponentLength: Integer; lpFileSystemFlags: Integer; lpFileSystemNameBuffer: StringBuilder; nFileSystemNameSize: Integer; begin nVolumeNameSize := 50; lpVolumeNameBuffer := StringBuilder.Create(nVolumeNameSize); nFileSystemNameSize := 50; lpFileSystemNameBuffer := StringBuilder.Create(nFileSystemNameSize); if not Self.GetVolumeInformation( Self._name, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize) then begin raise ArgumentException.Create('ErrorCode: '+GetLastError.ToString); end else begin Result := lpVolumeNameBuffer.ToString; end; end; end. |
Re: GetVolumeinformation
Hallo,
für NET 2.0 gibt es im Namespace System.IO die DriveInfo-Klasse. Für NET 1.1 solltest Du in diesem Namespace folgende Klassen untersuchen: Directory und DirectoryInfo (nämlich bezogen auf die Root des betreffenden Laufwerks) und Path. Vielleicht genügen Dir die dort bereitgestellten Methoden. Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 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