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/)
-   -   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.

Captnemo 6. Okt 2015 07:47

AW: Alle MountPoints auslesen
 
Zitat:

Zitat von Neutral General (Beitrag 1317748)
Notfalls halt einfach grad die Funktion von MSDN abtippen.

Wie, abtippen?


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.

Captnemo 6. Okt 2015 08:13

AW: Alle MountPoints auslesen
 
Okay, geht wohl nur wenn ich die Function aus der kernel32 importiere:

Delphi-Quellcode:
    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';
Allerdings meckert mir jetzt Delphi die erste Zeile gleiche an:
Code:
Erwartet: ':', aber ein String-Literal "kernel32.dll" erhalten in Zeile 42
Aber Schreibweise ist laut Delphi-Hilfe so korrekt. Was mache ich hier falsch?

Neutral General 6. Okt 2015 08:16

AW: Alle MountPoints auslesen
 
Zitat:

Zitat von Captnemo (Beitrag 1317751)
Okay, geht wohl nur wenn ich die Function aus der kernel32 importiere:
Delphi-Quellcode:
    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';

Das meinte ich ja ;)
Zitat:

Zitat von Captnemo (Beitrag 1317751)
Allerdings meckert mir jetzt Delphi die erste Zeile gleiche an:
Code:
Erwartet: ':', aber ein String-Literal "kernel32.dll" erhalten in Zeile 42
Aber Schreibweise ist laut Delphi-Hilfe so korrekt. Was mache ich hier falsch?

Sieht gut aus. Hab mal meine ganze Unit kopiert. Die compiliert so:
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.

Sir Rufo 6. Okt 2015 08:40

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:
PWideChar
ein?

Neutral General 6. Okt 2015 08:58

AW: Alle MountPoints auslesen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1317753)
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:
PWideChar
ein?

Ich hab hier Delphi7 - Also alles in Ordnung :stupid:
Ansonsten muss es so wie es da oben steht entweder FindFirstVolumeW/FindNextVolumeW oder PAnsiChar heißen.

Captnemo 6. Okt 2015 09:16

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.

Sir Rufo 6. Okt 2015 10:01

AW: Alle MountPoints auslesen
 
Zitat:

Zitat von Neutral General (Beitrag 1317754)
Zitat:

Zitat von Sir Rufo (Beitrag 1317753)
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:
PWideChar
ein?

Ich hab hier Delphi7 - Also alles in Ordnung :stupid:

Ja genau, und als alle ihren tollen Code dann auf den Unicode-Compiler losgelassen haben heulten sie wie die kleinen Kinder den man den Schnuller geklaut hatte. Wie konnte Borlacodero so etwas nur machen, das hat immer wunderbar funktioniert ... bis zu dieser Umstellung.

Nein, ich habe doch keinen Fehler gemacht! :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 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