AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetVolumeinformation

Ein Thema von impz · begonnen am 26. Mär 2006 · letzter Beitrag vom 5. Dez 2006
Antwort Antwort
impz

Registriert seit: 26. Mär 2006
4 Beiträge
 
Delphi 2005 Personal
 
#1

GetVolumeinformation

  Alt 26. Mär 2006, 15:08
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.
Ben
Risk everything or gain nothing.
  Mit Zitat antworten Zitat
impz

Registriert seit: 26. Mär 2006
4 Beiträge
 
Delphi 2005 Personal
 
#2

Re: GetVolumeinformation

  Alt 26. Mär 2006, 16:31
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);
Ben
Risk everything or gain nothing.
  Mit Zitat antworten Zitat
RolliRocker

Registriert seit: 10. Jan 2006
Ort: Donaustauf
1 Beiträge
 
#3

Re: GetVolumeinformation

  Alt 10. Apr 2006, 14:09
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?
  Mit Zitat antworten Zitat
gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: GetVolumeinformation

  Alt 2. Dez 2006, 16:55
"Header Declared in Winbase.h; include Windows.h."

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

greez
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: GetVolumeinformation

  Alt 2. Dez 2006, 19:53
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?
  Mit Zitat antworten Zitat
Heffalump

Registriert seit: 3. Aug 2005
278 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: GetVolumeinformation

  Alt 4. Dez 2006, 17:30
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.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#7

Re: GetVolumeinformation

  Alt 5. Dez 2006, 08:52
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 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