Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Alle MountPoints auslesen (https://www.delphipraxis.net/149586-alle-mountpoints-auslesen.html)

ThoPos 24. Mär 2010 18:29


Alle MountPoints auslesen
 
Hallo Zusammen,

ich stehe vor einen Problem zum Thema "Mounten von Datenträgern", für das ich keine Lösung gefunden habe.
Ich habe viele Tipps gefunden, wie ich den MountPoint "\\?\\Volume{..." für ein vorhandenes Laufwerk ermitteln kann.

Was ich benötige, ist eine Routine, die mir alle Datenträger ausliest. Auch die, die keinen Laufwerksbuchstaben haben oder mit einem Verzeichnis gemountet sind. Z.B. den USB-Stick, der keinen Buchstaben zugewiesen bekam, weil dieser schon belegt war.

Ich benötige die interne Bezeichnungen "\\?\\Volume{...", damit ich diese Laufwerke ggf. durch mein Programm mounten kann.


Kann mir hierzu einer helfen?

Gruß aus Köln
Thomas

Remko 25. Mär 2010 16:42

Re: Alle MountPoints auslesen
 
Use FindFirstVolume then step through all available volumes with FindNextVolume.

See also http://www.remkoweijnen.nl/blog/2008...a-device-name/ and http://www.remkoweijnen.nl/blog/2008...er-assignment/

ThoPos 25. Mär 2010 17:36

Re: Alle MountPoints auslesen
 
Hello Remko,

thanks for the informations. It works fine:

Delphi-Quellcode:
procedure GetVolumes(Vol:TStrings);
var Res : integer;
    Buf : array [0..MAX_PATH] of Char;
begin
 Vol.Clear;
 Res := FindFirstVolume(Buf,SizeOf(Buf));
 repeat
  Vol.Add(StrPas(Buf));
 until (not FindNextVolume(Res,Buf,SizeOf(Buf)));
 FindVolumeClose(Res);
end;
Do you know a function like GetDriveType, whitch I could use for unmounted volumes?

Gruß aus Köln
Thomas

Remko 25. Mär 2010 20:03

Re: Alle MountPoints auslesen
 
You should check for errors...
Delphi-Quellcode:
  hVolume := FindFirstVolumeW(VolumeName, CharCount);

  if hVolume = INVALID_HANDLE_VALUE then
...
As far as I recall GetDriveType should return the type for non mounted volumes as well, does my ChDrvLetter program show it? If so then GetDriveType works ;-)

(if you run ChrDrvLetter without parameters it will just dump all volumes, this is the example output on my pc:)
Delphi-Quellcode:
c:\Users\rweijnen\Documents\Delphi\OldProjects\ChDrvLetter>ChDrvLetter.exe
ChDrvLetter v1.4 (c) Copyright 2008 by Remko Weijnen ([url]www.remkoweijnen.nl[/url])

Assigned Letters: [CDY]

Volume 0
Letter: C:\
Label : SEVEN
Device: \Device\HarddiskVolume1
Name : \\?\Volume{445041c9-9f61-11de-87fd-806e6f6e6963}\
Type : DRIVE_FIXED

Volume 1
Letter: D:\
Label : MFD2_UNLOCK
Device: \Device\CdRom0
Name : \\?\Volume{445041cd-9f61-11de-87fd-806e6f6e6963}\
Type : DRIVE_CDROM

Volume 2
Letter: Y:\
Label : dvd2_eur_2010_vx v7
Device: \Device\CdRom1
Name : \\?\Volume{f097e2b2-9fcc-11de-8c17-001e3799c3f7}\
Type : DRIVE_CDROM

ThoPos 12. Mär 2014 12:23

AW: Re: Alle MountPoints auslesen
 
Hallo zusammen,

ich muß diesen Thread mal wieder an's Licht holen.


Diese Procedure läuft unter Delphi 2007 fehlerfrei

Delphi-Quellcode:
procedure GetVolumes(Vol:TStrings);
var Res : integer;
    Buf : array [0..MAX_PATH] of Char;
begin
 Vol.Clear;
 Res := FindFirstVolume(Buf,SizeOf(Buf));
 repeat
  Vol.Add(StrPas(Buf));
 until (not FindNextVolume(Res,Buf,SizeOf(Buf)));
 FindVolumeClose(Res);
end;
Seit einigen Wochen nutze ich jetzt Delphi XE4. Und hier kommt es beim Befehl FindNextVolume zu einem Kernel32 Fehler.
Hat jemand 'ne Idee und noch besser: 'ne Lösung?


Gruß aus Köln
Thomas

himitsu 12. Mär 2014 12:29

AW: Alle MountPoints auslesen
 
Delphi-Quellcode:
SizeOf(Buf)
?

Überleg mal, was man da als zweiten/dritten Parameter übergeben soll. :zwinker:



Delphi-Quellcode:
Length(Buf)


Tja, hätte man mal gleich die Dokumentation richtig gelesen. :angle:

Wobei die Fehlerbehandlung nun auch nicht sonderlich ideal ist.


[add]
Delphi-Quellcode:
procedure GetVolumes(Vol:TStrings);
var Res : THandle;
    Buf : array [0..MAX_PATH] of Char;
begin
  Vol.Clear;
  Res := FindFirstVolume(Buf, Length(Buf));
  if Res = INVALID_HANDLE_VALUE then
    RaiseLastOSError;
  repeat
    Vol.Add(StrPas(Buf));
  until not FindNextVolume(Res, Buf, Length(Buf));
  FindVolumeClose(Res);
end;

Aphton 12. Mär 2014 14:38

AW: Alle MountPoints auslesen
 
Also strengnenommen, himitsu, ist das ja auch nicht ganz korrekt =P
Wenn, dann~
Length() * SizeOf()..

himitsu 12. Mär 2014 16:34

AW: Alle MountPoints auslesen
 
Neeee.

Delphi-Quellcode:
Length(x) * SizeOf(Char)
oder
Delphi-Quellcode:
SizeOf(StaticCharArray)
wäre nur richtig, wenn man dort die Länge in Bytes angeben soll.

Delphi-Quellcode:
Length(x)
ist dafür, wenn man die Länge in Zeichen anzugeben hat. :zwinker:

Captnemo 6. Okt 2015 07:10

AW: Alle MountPoints auslesen
 
Kann mir jemand sagen, welche Unit ich der Uses hinzufügen muss, damit XE4 FindFistVolume, FindNextVolume und FindVolumeClose findet? Hab schon mit Grep das ganze Emba-Verzeichnis durchsucht, aber keinen Treffer erhalten.

Neutral General 6. Okt 2015 07:39

AW: Alle MountPoints auslesen
 
Mein Delphi7 hier kannte es auch nicht (was nichts heißen muss).
Notfalls halt einfach grad die Funktion von MSDN abtippen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 Uhr.
Seite 1 von 2  1 2      

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