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/)
-   -   Prism GetVolumeinformation (https://www.delphipraxis.net/66197-getvolumeinformation.html)

impz 26. Mär 2006 15:08


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:
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;
In der MSDN (MSDN - GetVolumeInformation) steht ja, dass man Pointer verwenden soll. Delphi.Net verlangt aber StringBuilder für diese Funktion (Delphi Win32 verlangt Pointer).

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.

impz 26. Mär 2006 16:31

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);

RolliRocker 10. Apr 2006 14:09

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?

gabneo 2. Dez 2006 16:55

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

Muetze1 2. Dez 2006 19:53

Re: GetVolumeinformation
 
Zitat:

Zitat von gabneo
"Header Declared in Winbase.h; include Windows.h."

Auszug aus der MSDN, demnach müsste es ausreichen Windows in die Uses einzubinden.

Sicher das dies auch bei .NET klappt?

Heffalump 4. Dez 2006 17:30

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.

Jürgen Thomas 5. Dez 2006 08:52

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 08:07 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