![]() |
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 |
Re: Alle MountPoints auslesen
Use
![]() ![]() See also ![]() ![]() |
Re: Alle MountPoints auslesen
Hello Remko,
thanks for the informations. It works fine:
Delphi-Quellcode:
Do you know a function like GetDriveType, whitch I could use for unmounted volumes?
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; Gruß aus Köln Thomas |
Re: Alle MountPoints auslesen
You should check for errors...
Delphi-Quellcode:
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 ;-)
hVolume := FindFirstVolumeW(VolumeName, CharCount);
if hVolume = INVALID_HANDLE_VALUE then ... (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 |
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:
Seit einigen Wochen nutze ich jetzt Delphi XE4. Und hier kommt es beim Befehl FindNextVolume zu einem Kernel32 Fehler.
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; Hat jemand 'ne Idee und noch besser: 'ne Lösung? Gruß aus Köln Thomas |
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; |
AW: Alle MountPoints auslesen
Also strengnenommen, himitsu, ist das ja auch nicht ganz korrekt =P
Wenn, dann~ Length() * SizeOf().. |
AW: Alle MountPoints auslesen
Neeee.
Delphi-Quellcode:
oder
Length(x) * SizeOf(Char)
Delphi-Quellcode:
wäre nur richtig, wenn man dort die Länge in Bytes angeben soll.
SizeOf(StaticCharArray)
Delphi-Quellcode:
ist dafür, wenn man die Länge in Zeichen anzugeben hat. :zwinker:
Length(x)
|
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.
|
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. |
AW: Alle MountPoints auslesen
Zitat:
Die sich oben beteiligten DP-Mitglieder verwenden die Funktion ja auch. Also bin ich jetzt mal von einer Unit in den Uses ausgegangen. Oder sind das ggf. Funktionen einer DLL z.b. kernel? Leider postet ja niemand den Interface-Abschnitt. |
AW: Alle MountPoints auslesen
Okay, geht wohl nur wenn ich die Function aus der kernel32 importiere:
Delphi-Quellcode:
Allerdings meckert mir jetzt Delphi die erste Zeile gleiche an:
function FindFirstVolume(lpszVolumeName: PChar; cchBufferLength: DWord): THandle; stdcall; external 'kernel32.dll' name 'FindFirstVolumeA';
function FindNextVolume(hFindVolume: THandle; lpszVolumeName: LPTSTR; cchBufferLength: DWORD): BOOL; stdcall; external 'kernel32.dll' name 'FindNextVolumeA'; function FindVolumeClose(hFindVolume: THandle): BOOL; stdcall; external 'kernel32.dll' name 'FindVolumeClose';
Code:
Aber Schreibweise ist laut Delphi-Hilfe so korrekt. Was mache ich hier falsch?
Erwartet: ':', aber ein String-Literal "kernel32.dll" erhalten in Zeile 42
|
AW: Alle MountPoints auslesen
Zitat:
Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; function FindFirstVolume(lpszVolumeName: PChar; cchBufferLength: DWord): THandle; stdcall; external 'kernel32.dll' name 'FindFirstVolumeA'; function FindNextVolume(hFindVolume: THandle; lpszVolumeName: LPTSTR; cchBufferLength: DWORD): BOOL; stdcall; external 'kernel32.dll' name 'FindNextVolumeA'; function FindVolumeClose(hFindVolume: THandle): BOOL; stdcall; external 'kernel32.dll' name 'FindVolumeClose'; var Form1: TForm1; implementation {$R *.dfm} end. |
AW: Alle MountPoints auslesen
Beim dem Code fangen meine Augen sofort an zu tränen :shock:
Was fällt uns zu den Schlagworten
Delphi-Quellcode:
/
PChar
Delphi-Quellcode:
/
PAnsiChar
Delphi-Quellcode:
ein?
PWideChar
|
AW: Alle MountPoints auslesen
Zitat:
Ansonsten muss es so wie es da oben steht entweder FindFirstVolumeW/FindNextVolumeW oder PAnsiChar heißen. |
AW: Alle MountPoints auslesen
Jetzt meckert er bei mir auch nicht mehr. Einmal Delphi neu starten und der Fehler war weg!
Naja, lief jetzt seit fast 2 Wochen am Stück durch. Bin immer zu Faul meinen Rechner runter zu fahren. |
AW: Alle MountPoints auslesen
Zitat:
Nein, ich habe doch keinen Fehler gemacht! :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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